2014-12-05 98 views
2

我在QNX 6.5.0中构建了boost 1.57.0。没有生成错误。但是一些库链接到libboost_system.so指定相对路径。我保存了编译日志。下面是boost_thread联动步:用相对路径构建的boost库

"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定义)

+1

同样的问题在http讨论删除$(HAVE_SONAME)://计算器。 com/q/23485903/1048959 – 2015-07-07 17:27:47

回答

3

,你会发现libboost_system.so的NEEDED条目包含一个(相对)路径。根据ELF规范,NEEDED条目应该只包含所需库的名称,所以链接器或QCC中似乎存在错误。

因为如果这样,系统将无法在运行时找到该文件,除非当前目录与链接发生时相同。

最简单的解决方法是静态链接到libboost_thread.a。

另一种变通,我用我自己是创建一个围绕QCC一个包装,变换命令行,那样依赖给定为-Wl,-L <path> -Wl,-l <name>,而不是<path>/lib<name>.so这也需要改变Boost编译系统,以便它不不会将版本号附加到库文件名的末尾。

+0

只是在旧的答案上注释... [ELF规范](http://flint.cs.yale.edu/cs422/doc/ELF_Format.pdf)在这里没有违反。该错误在Boost.Build中;请参阅下面的答案。 – Lack 2016-10-10 05:10:55

-1

我认为你应该从临时区域拿走图书馆。

我平时也有类似的东西:

-L /home/.../boost/stage/lib/ -lboost_system 

当然你升压目录


略有关更换/home/.../boost作者:同上面的配置,你需要确保正确的版本的库位于加载器库路径(LD_LIBRARY_PATH,ldconfig)中。

如果你想有一个开发版本,你可以在你建立了这个在系统上的“只运行”,可以烤库路径对进入目标二:如果你运行objdump -p libboost_thread.so

-Wl,-rpath -Wl,/home/.../boost/stage/lib/:/usr/lib/x86_64-linux-gnu 
+0

我也在库文件安装在/ usr/local/lib后试过ldd。结果是一样的。 – 2014-12-05 09:04:05

+0

@QQ我看不出你的评论与我的答案有什么关系。 – sehe 2014-12-05 09:35:17

0

正如Nicklas Angare所写,问题是NEEDED条目包含构建时的相对路径,它应该只包含.so文件的名称。

这是因为传给连接器的共享库没有SONAME,并是因为链接器未给-h选项。

ld documentation

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

为什么链接器不能获得qcc构建的-h选项?这似乎是一个长期被忽视的升压的bug(见Boost.org ticketgithub issue

的解决方案,如上面的链接提示,是从tools/build/v2/tools/qcc.jam