我目前正在尝试在Ubuntu 14.04计算机上重建FlightGear。一切进展顺利,直到我决定构建fgrun
需要Qt的版本。我决定将Qt编译为静态库,因为我不希望自建的库超过系统上的任何库。
我像这样在系统上静态构建Qt:
./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展示了在哪里可以找到库,并且一切都很好,直到最后一个链接阶段为止:
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
。但是,我已经确保Qt和FlightGear都使用该-ldl
标志构建,但是仍然出现此错误。
所以现在,这使我想到了一个问题:甚至可以从静态库动态链接吗?我以为-ldl必须包含在静态库中,这是一个坏主意,这是正确的吗?
错误消息指出您缺少dlclose@@GLIBC_2.2.5
glibc(GCC使用的GNU C库)的一部分。该符号是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版本。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句