最近在移植opencv2.0的时候遇到该问题,工作环境如下:
宿主机:ubuntu9.04 kernel 2.6.28 arm-none-linux-4.3.2
开发板:OMAP4 ubuntu12.04 桌面版 gcc version 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5)
当把在宿主机编译好的程序移植到另一个开发板(ubuntu core, kernel 3.0)时能正常运行,但把所有编译的库和程移植到新的开发板时,出现上述问题。
注意:如下命令都是在开发板的系统上执行的!可能有些开发板所安装的系统无如下一些命令,可以通过apt-get install binutils 安装试试
执行程序命令: ./test 出现错误:
bash: test : No such file or directory
确定执行的命令没有错,路径没有问题,另外通过 ls -l 查看,权限足够。
执行: ldd test 返回:not a dynamic executable
执行:file test 返回如下:
test: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (use shared libs), for GNU/Linux 2.6.14, not stripped
我所装的是32的系统而不是64位的,所以不是64位的系统没有32位的库造成的,根据网上的资料继续执行:
readelf -l test | grep interpreter #查看该程序的加载程序
返回:[Requesting program interpreter: /lib/ld-linux.so.3] 由这该程序由/lib/ld-linux.so.3
但在/lib/下没有发现ld-linux.so.3 所以,问题应该就是出在这个test程序的加载上了,执行./test 返回的 No such file or directory 并不是指找不着test这个文件而是指的/lib/ld-linux.so.3这个文件或者其它的test所依赖的动态库。
下一步查看开发板是通过哪个程序来加载程序的,因为我的开发板的系统带了gcc,所以继续
echo "void main{}" > dummy.c
gcc dummy.c
readelf -l a.out | grep interpreter 返回如下:
[Requesting program interpreter: /lib/ld-linux-armhf.so.3] 由这可以看出板子上的程序是由/lib/ld-linux-armhf.so.3这个程序加载
ls -l /lib/ld-linux-armhf.so.3 返回:/lib/ld-linux-armhf.so.3 -> arm-linux-gnueabihf/ld-2.15.so
ln -sv /lib/arm-linux-gnueabihf/ld-2.15.so /lib/ld-linux.so.3 建立链接
执行: ./test 返回结果已经变了,如下:
./test: error while loading shared libraries: libcv.so.4: cannot open shared object file: No such file or directory
这有可能是libcv.so.4没有加载造成的,
ldconfig #加载动态库
ldconfig -p | grep libcv
返回:libcv.so (libc6) =>/opt/opencv2.0/lib/libcv.so # 通过这个确定libcv.so这个库己经加载了,但却没有找到,这是乍回事呢?
从上面的结果上还看到这个libcv.so 还依懒于libc6这个库,是否没有libc.so.6这个库呢?
ls -l /lib | grep libc #通过这个命令查看果然没有libc.so.6这个命令,通过find /lib -name libc.so.6 发现
/lib/arm-linux-gnueabihf/libc.so.6
于是建立链接:
ln -sv /lib/arm-linux-gnueabihf/libc.so.6 /lib/libc.so.6
执行:./test 如果如下:
./test: error while loading shared libraries: libcv.so.4: cannot open shared object file: No such file or directory
到此我怀疑程序test所依懒的libc.so.6与系统中的libc.so.6是不兼容的,因为通过ldconfig -p 查看很多库依懒的是libc6, hard-float. 于是我决定换一个编译器了。
通过查资料发现:
在2012年4月13号的时候由Linaro组织开了一个会议,以统一各ARM板linux系统发行版的加载程序/lib/ld-linux.so.3的路径及名称,在这前:
Debian/Ubuntu 用的是:/lib/arm-linux-gnueabihf/ld-linux.so.3
Fedora, OpenSUSE用的是:/lib/ld-linux.so.3
这就会造成编译好的程序在不同的linux版本上运行不兼容,因此才会出现:No such file or directory的出错。
这会议之后的统一的加载程序是:/lib/ld-linux-armhf.so.3
所以要找编译器,也最好是找2012年4月13号之后的,于是我用gcc-linaro-arm-linux-gnueabihf-4.7-2013.02-01-20130221_linux编译器重新编译了一遍,问题解决了。
参考:http://superuser.com/questions/344533/no-such-file-or-directory-error-in-bash-but-the-file-exists
http://ubuntuforums.org/showthread.php?t=2031471
https://wiki.linaro.org/OfficeofCTO/HardFloat/LinkerPathCallApr2012