“没有这样的文件或目录”链接器错误,LD_LIBRARY_PATH 设置正确

Posted

技术标签:

【中文标题】“没有这样的文件或目录”链接器错误,LD_LIBRARY_PATH 设置正确【英文标题】:"No such file or directory" linker error, LD_LIBRARY_PATH set correctly 【发布时间】:2014-11-19 16:13:55 【问题描述】:

一些背景知识:我正在使用嵌入式板(SolidRun Cubox-i4 Pro),并使用从 SolidRun 社区论坛获得的图像在其上安装了 Ubuntu 14.04。

这个特殊的主板有一个宣传 OpenCL 支持的 Vivante GC2000 图形驱动程序。然而,GPU 驱动程序被证明是一种痛苦。我找到了所有必需库的二进制文件,但是当我尝试运行针对它们构建的小型测试可执行文件时,我得到了这个熟悉的错误:

cubox@cubox:~/cltest$ g++ cltest.cpp -lOpenCL -lGAL
cubox@cubox:~/cltest$ ./a.out 
./a.out: error while loading shared libraries: libOpenCL.so: cannot open shared object file: No such file or directory

所以我仔细检查了库的路径:

cubox@cubox:~/cltest$ ls /usr/lib/libOpenCL*   
/usr/lib/libOpenCL.so

我仔细检查了我的 LD_LIBRARY_PATH 变量:

cubox@cubox:~/cltest$ echo $LD_LIBRARY_PATH
/usr/lib

好的,很明显问题不在于它找不到库,而是存在某种不兼容,并且错误具有误导性(我以前见过这个)。所以我试试这个:

cubox@cubox:~/cltest$ file /usr/lib/libOpenCL.so 
/usr/lib/libOpenCL.so: ELF 32-bit LSB  shared object, ARM, EABI5 version 1 (SYSV), dynamically linked, not stripped

...并将其与我刚刚编译的内容进行比较:

cubox@cubox:~/cltest$ file a.out 
a.out: ELF 32-bit LSB  executable, ARM, EABI5 version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=fcd06f947198f92f43f364874fcef66a6303e7b4, not stripped

它们看起来很相似,只是其中提到了for GNU/Linux 2.6.32。然后我记得驱动程序附带了一些预编译的测试应用程序,所以我运行了其中一个:

cubox@cubox:/opt/viv_samples/cl11/fft$ ./fft 
-bash: ./fft: No such file or directory

...并检查了它的file 信息:

cubox@cubox:/opt/viv_samples/cl11/fft$ file fft
fft: ELF 32-bit LSB  executable, ARM, EABI5 version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.31, stripped

所以一个用于GNU/Linux 2.6.32,另一个用于GNU/Linux 2.6.31

问题:

    这就是为什么什么都不会执行或“找到”这些库的原因吗? 如果是这样,我有什么选择?我可以强迫他们以某种方式运行吗? 我可以运行其他命令来了解有关库的更多信息吗?

编辑以回应答案:

ldd 输出:

cubox@cubox:~/cltest$ ldd a.out 
    libOpenCL.so => not found
    libGAL.so => not found
    libstdc++.so.6 => /usr/lib/arm-linux-gnueabihf/libstdc++.so.6 (0x76ea1000)
    libgcc_s.so.1 => /lib/arm-linux-gnueabihf/libgcc_s.so.1 (0x76e80000)
    libc.so.6 => /lib/arm-linux-gnueabihf/libc.so.6 (0x76d99000)
    libm.so.6 => /lib/arm-linux-gnueabihf/libm.so.6 (0x76d2c000)
    /lib/ld-linux-armhf.so.3 (0x76f5f000)

可执行权限已经正确(我的为-rwxrwxr-x,fft 应用为-rwxr-xr-x)。

【问题讨论】:

也许您遇到了与此问题/答案中所述类似的问题:unix.stackexchange.com/questions/76490/… 可能是找到了libOpenCL.so,但缺少其中一个依赖项,尝试在libOpenCL.so本身上运行ldd 【参考方案1】:

在您的可执行文件上运行 ldd 以检查它想要拉入哪些共享库。

另外,要运行一个程序,它需要在许可中设置一个可执行位

$ ls -la fft

$ chmod a+x fft ./fft

【讨论】:

系统不允许我对原帖发表评论。【参考方案2】:

几乎可以肯定,问题在于你没有export LD_LIBRARY_PATH,所以它只是在你的shell中设置,而不是导出到a.out子进程。

见LD_LIBRARY_PATH, the shared lib path in linux

【讨论】:

以上是关于“没有这样的文件或目录”链接器错误,LD_LIBRARY_PATH 设置正确的主要内容,如果未能解决你的问题,请参考以下文章

node.js - 错误:ENOENT:没有这样的文件或目录,取消链接

从项目中删除文件时包裹捆绑器“ENOENT:没有这样的文件或目录”

致命错误:modbus.h:没有这样的文件或目录

stm32的系统工作台:致命错误...没有这样的文件或目录

npm 错误! Windows_NT 6.1.7601:ENOENT:没有这样的文件或目录

clang:错误:没有这样的文件或目录:'dynamic_lookup' clang:错误:没有这样的文件或目录:'suppress'