使用相对路径构建库

时间:2014-12-05 08:56:44

标签: boost linkage

我在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定义)

3 个答案:

答案 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 选项

来自ld documentation

  

-h 名称
  -soname = 名称
  创建ELF共享对象时,将内部DT_SONAME字段设置为指定的名称。当可执行文件与具有DT_SONAME字段的共享对象链接时,则在运行可执行文件时,动态链接器将尝试加载由DT_SONAME字段指定的共享对象,而不是使用为链接器指定的文件名。

为什么链接器不能为qcc构建获取-h选项?它似乎是一个长期被忽视的Boost错误(请参阅Boost.org ticketgithub 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