bash: ***: No such file or directory

最近在移植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



你可能感兴趣的:(linux相关)