Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2959137
  • 博文数量: 685
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 5303
  • 用 户 组: 普通用户
  • 注册时间: 2014-04-19 14:17
个人简介

文章分类

全部博文(685)

文章存档

2015年(116)

2014年(569)

分类: 嵌入式

2014-09-29 09:54:15

原文地址:http://blog.csdn.net/dlutxie/article/details/8645051

最近在移植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编译器重新编译了一遍,问题解决了。

参考:


阅读(1928) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~