如何找到库的依赖性

How to find library dependency?

本文关键字:依赖性 何找      更新时间:2023-10-16

我在没有root访问的Linux计算机上。这台计算机上的Boost 1.36,但我需要一个较新的Boost版本,因此我安装了Boost 1.62的本地版本。我将一些对象文件与NVCC链接。该链接还包括大约20个第三方动态库。链接的输出结果是另一个动态库。

问题是:如果我在输出库上运行'ldd',它告诉我库都取决于libboostrongystem.so.1.36.0和libboostrongystem.so.1.62.0。

我无法弄清楚libboostrongystem.so.1.36.0如何进入那里。其他动态库都不取决于libboostrongystem.so.1.36.0(所有这些库(。我该如何判断libboost 1.36依赖性来自哪里?

这是链接器命令的简要说明,该命令创建输出库:

nvcc --ptxas-options=-v --compiler-options '-fPIC' --shared
lots of object files
lots of -L/wherever -lwhatever options
-o libOutput.so

此问题不是使用nvcc的特定特定。当您链接可执行文件时,将路径传递给第三方库,并将-L标志带到链接器。当您执行ldd或最终使用库的二进制文件时,调用了动态加载程序。LD.SO(8(手册描述了加载程序查找库时搜索路径的顺序。在您的情况下,装载机很可能会首先找到增强1.36 libs,而仅对于1.36版本中不存在的libs,它又回到了1.62版本。我建议您检查LD_LIBRARY_PATH环境变量中路径的顺序。

还请注意,ldd是递归的,因此它没有显示您的库链接到的libs。您可以使用例如此答案中提到的lddtree

使用objdump -p libABCD.so | grep NEEDED查看单个库文件的依赖项。然后关注输出库。

,而不是在链接器命令行上以-L的形式将boost库作为-l,您还可以给他们提供其完整的路径和文件名。这样,链接器不会在搜索路径中寻找这些库,您可以确保不会偶然地拾取系统版本。

如果问题持续存在,我建议测试一个最小的示例,该示例不需要任何Boost库,以查看NVCC是否会在任何情况下绘制某些系统版本的Boost-System库。