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

时间:2014-11-19 16:13:55

标签: c++ linux shared-libraries embedded-linux ld

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

这个特殊的主板有一个Vivante GC2000图形驱动程序,可以宣传OpenCL支持。然而,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

问题:

  1. 这就是为什么没有任何东西可以执行或“找到”库?
  2. 如果是这样,我的选择是什么?我可以强迫他们以某种方式运行吗?
  3. 我可以运行另一个命令来了解有关这些库的更多信息吗?
  4. 编辑回答答案:

    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)。

2 个答案:

答案 0 :(得分:1)

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

此外,要运行程序,需要在permitions中设置可执行位

$ ls -la fft

$ chmod a + x fft ./fft

答案 1 :(得分:0)

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

请参阅LD_LIBRARY_PATH, the shared lib path in linux