dynamic链接从静态libarary?

我目前正在尝试在我的Ubuntu 14.04机器上重buildFlightGear。 一切顺利,直到我决定构build需要Qt的fgrun 。 我决定编译Qt作为一个静态库,因为我不希望自build库超出系统上的任何一个。

我静静地在系统上构buildQt,如下所示:

 ./configure -static -opensource -nomake tests -gtkstyle -prefix /home/user/Qt/5.4/Src/qtbuild -no-rpath -no-compile-examples -system-proxies -skip qtwebkit -skip qtwebkit-examples -nomake tools -nomake examples -skip script -release -skip multimedia -verbose -l dl -skip location -skip multimedia -skip quick1 -skip quickcontrols -skip sensors -skip serialport -skip svg -skip tools -skip translations -skip wayland -skip webchannel -skip webengine -skip xmlpatterns -skip activeqt -skip connectivity -skip declarative -skip doc -skip enginio -skip graphicaleffects -skip imageformats -skip websockets 

我展示了FlightGear的CMake在哪里find这些库,一切都很好,直到最后的链接阶段:

 Linking CXX executable fgfs /usr/bin/ld: /home/user/Qt/5.4/Src/qtbuild/lib/libQt5Core.a(qlibrary_unix.o): undefined reference to symbol 'dlclose@@GLIBC_2.2.5' /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/libdl.so: error adding symbols: DSO missing from command line collect2: error: ld returned 1 exit status 

现在,我已经遇到过这个问题,这是一个不通过-ldl链接dynamic链接库的问题。 不过,我已经确保Qt和FlightGear都是用-ldl标志构build的,但是我仍然得到这个错误。

所以,现在,这引发了我的想法:是否有可能从一个静态库dynamic链接? 我会想象,这将是必须包括在静态库,这将是一个坏主意,这是正确的?

错误消息说你缺少glibc(GCC使用的GNU C库)的一部分dlclose@@GLIBC_2.2.5 。 这个符号是dl.so一部分,映射到我系统上的/lib/x86_64-linux-gnu/libdl.so.2

将其添加到版本时,请确保-ldl位于命令的末尾。 链接器会在处理库时收集丢失的符号,但它只会处理每个库一次。 所以你需要确定-dl是在需要的库之后。

它甚至有可能从静态库动态链接?

是。 一个静态库被添加到你的代码,就好像它是你自己的源代码的一部分,即库只是一堆编译对象( *.o )文件。 函数名称是查找对象文件的关键。 你也可以打开图书馆并写下:

 gcc -o exe main.o qtfoo.o -ldl 

qtfoo.o是来自libQt5Core.a的条目

另一个解决方案是使用动态加载构建Qt并将其安装到$HOME/local/ 。 生成安装程序应该允许指定安装文件夹。

当您构建FlightGear时,您可以将$HOME/local/lib作为共享库的附加文件夹。 要启动FlightGear,您需要设置环境变量LD_LIBRARY_PATH 。 如果你在启动脚本中这样做,只有FlightGear才能看到/使用你自己的Qt版本。