【问题标题】:Cannot find library, even though it is on search path找不到库,即使它在搜索路径上
【发布时间】:2015-08-04 17:11:27
【问题描述】:

在 Ubuntu 14.04 中,我下载了一些带有 makefile 的源代码。然后我在它上面运行“make”来编译,它构建了一个可执行文件。执行此文件时,我收到以下错误:

./mt_test: error while loading shared libraries: libcudart.so.7.0: cannot open shared object file: No such file or directory

现在,文件libcudart.so.7.0 位于目录/usr/local/cuda-7.0/lib64 中。但在我的.bashrc 文件中,我有一行:export LD_LIBRARY_PATH=/usr/local/cuda-7.0/lib64:$LD_LIBRARY_PATH。此外,如果我从终端运行echo $LD_LIBRARY_PATH,则其中一个条目就是此路径。我的系统上其他地方没有libcudart.so.7.0 的其他副本。

是否有任何原因导致可执行文件可能无法找到该库,即使其目录是搜索目录之一?

奇怪的是,这个错误是在我的系统上安装 Matlab 之后才发生的。现在有一个名为libcudart.so.6.5 的文件位于/usr/local/MATLAB/R2015a/bin/glnxa64,但此路径不属于LD_LIBRARY_PATH

【问题讨论】:

  • 该目录中有libcudart.so.7.0 吗?也许它真的是libcudart.so.7.0.1.2.3.4.5.6,并且没有建立到“普通”.so.7.0 的符号链接。或 so.7.0 符号链接存在,但悬空。
  • 不,我整个系统上唯一的libcudart.so.7.0/usr/local/cuda-7.0/lib64 中。
  • ldd ./mt_test 说什么?
  • 可能是 332 位/64 位问题? mt_test 程序是 64 位二进制文​​件吗?使用file mt_test 并查看它是否报告i386 或x86_64。您的 libcudart 是一个 64 位库,因此如果 mt_test 是一个 32 位二进制文​​件,它将无法工作。但是,如果您没有/找不到正确的共享库,我很惊讶它首先链接。除非它使用dlopen() 访问库而不是运行时链接器?

标签: c++ ubuntu linker makefile shared-libraries


【解决方案1】:

正如 MadScientist 可能正确猜测的那样,这很可能是 32 位与 64 位不匹配。运行以下命令:

file -L ./mt_test /usr/local/cuda-7.0/lib64/libcudart.so.7.0

该命令应该为两个文件报告ELF 32-bit LSB ...ELF 64-bit LSB ...。如果其中一个文件是 32 位,另一个是 64 位,则它们不兼容。

您可以通过运行以下命令进一步了解动态链接器在哪里搜索libcudart.so.7.0

LD_DEBUG=files,libs ./mt_test

【讨论】:

    猜你喜欢
    • 2012-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多