如何找到库的依赖性
How to find library dependency?
我在没有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库。
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 为什么野牛仍在使用"int yylex(void)",却找不到"int yylex(YYS
- C++ Windows 驱动程序MSB3030无法复制该文件,因为它找不到
- 如何找出GDB的SIGTRAP核心转储的根本原因
- 奇怪的(对我来说)返回声明 - 在谷歌上找不到任何关于它的信息
- 函数何时会在c++中包含stack_Unwind_Resume调用
- 找不到QtResource文件中的文件
- Python中的for循环与C++有何不同
- VC++本机单元测试,找不到调试符号
- RegGetValue在当前用户下找不到名称
- 带有 -stdlib=libc++ 的 clang++ 9.0.1 找不到<optional>
- c++找不到具有相同哈希的无序集合元素
- 找不到以下加速库:boost_fiber
- 找不到 FLTK(缺少:FLTK_INCLUDE_DIR)
- 设置 Visual Studio for MPI: 找不到标识符错误
- "assimp/config.h"找不到,但它在文件夹中
- 链接器找不到在虚拟类 c++ 中访问的静态字段的符号
- C++系统找不到指定的文件错误
- FindPackageHandleStandardArgs.cmake:137 的 CMake 错误(消息):找不到 Boost (缺少:正则表达式)(找到合适的版本"1.72.0",