我在QNX 6.5.0中构建了boost 1.57.0。没有构建错误。但是有些库链接到libboost_system.so,指定相对路径。我保存了编译日志。这是boost_thread的链接步骤:
"QCC_gpp" -o "bin.v2/libs/thread/build/qcc/release/threading-multi/libboost_thread.so.1.57.0" -shared "bin.v2/libs/thread/build/qcc/release/threading-multi/pthread/thread.o" "bin.v2/libs/thread/build/qcc/release/threading-multi/pthread/once.o" "bin.v2/libs/thread/build/qcc/release/threading-multi/future.o" "bin.v2/libs/system/build/qcc/release/threading-multi/libboost_system.so.1.57.0" -lm
所以,当我运行ldd libboost_thread.so
时,它找不到libboost_system。我认为libboost_thread应该与-lboost_system
选项相关联。但我不知道该怎么做。
感谢。
编辑:我无法构建任何与boost_thread链接的程序。因为,boost_thread在bin.v2/libs/system/build/qcc/release/threading-multi
文件夹中搜索boost_system。但是,boost_thread和boost_system都在库搜索文件夹中。 (用LD_LIBRARY_PATH
定义)
答案 0 :(得分:3)
如果您运行objdump -p libboost_thread.so
,您将发现libboost_system.so的NEEDED条目包含(相对)路径。根据ELF规范,NEEDED条目应仅包含所需库的名称,因此链接器或QCC中似乎存在错误。
因为如果这样,系统就无法在运行时找到该文件,除非当前目录与链接发生时的目录相同。
最简单的解决方法是静态链接到libboost_thread.a。
我自己使用的另一种解决方法是创建一个围绕QCC的包装器来转换命令行,以便依赖关系以-Wl,-L <path> -Wl,-l <name>
而不是<path>/lib<name>.so
给出这也需要更改到Boost构建系统,以便它不会将版本号附加到库文件名的末尾。
答案 1 :(得分:0)
正如Nicklas Angare所写,问题是NEEDED
条目包含构建时的相对路径,它应该只包含.so文件的名称。
这是因为给链接器的共享库没有SONAME
,而发生因为链接器没有给出 -h 选项
-h 名称
-soname = 名称
创建ELF共享对象时,将内部DT_SONAME字段设置为指定的名称。当可执行文件与具有DT_SONAME字段的共享对象链接时,则在运行可执行文件时,动态链接器将尝试加载由DT_SONAME字段指定的共享对象,而不是使用为链接器指定的文件名。
为什么链接器不能为qcc
构建获取-h选项?它似乎是一个长期被忽视的Boost错误(请参阅Boost.org ticket,github issue)
根据上述链接的建议,解决方案是从$(HAVE_SONAME)
中移除tools/build/v2/tools/qcc.jam
答案 2 :(得分:-1)
我认为您应该从暂存区域获取库。
我通常有类似的东西:
-L /home/.../boost/stage/lib/ -lboost_system
当然用你的升级目录替换/home/.../boost
略有关联:使用上面的配置,您需要确保正确版本的库位于加载程序库路径(LD_LIBRARY_PATH,ldconfig)上。
如果您想要一个可以在您构建的系统上“直接运行”的开发构建,您可以将库路径直接烘焙到目标二进制文件中:
-Wl,-rpath -Wl,/home/.../boost/stage/lib/:/usr/lib/x86_64-linux-gnu