在上篇文章中,我主要说出了问题,主要就是为什么交叉编译的opencv的代码不能再linaro的桌面上面执行,但是却能够在busybox制作的文件系统下面执行?这这边文章中我将简单的分析,并且写出解决的方法。
首先我在PC机上的ubuntu系统下面用交叉编译工具编译了源码,生成DisplayImg可执行程序拷贝到U盘,挂载在目标机上。我们首先看一下这个可执行程序的解释器:
root@linaro-ubuntu-desktop:/mnt# readelf -a DisplayImg |grep ld-linux
[Requesting program interpreter: /lib/ld-linux.so.3]
从上面的结果中可以看出,这个可执行程序用的是/lib/ld-linux.so.3这个解释器(暂时这么称呼吧,我不是很清楚).
但是在linaro桌面系统的/lib/下面没有这个文件的,但是有这个ld-linux-armhf.so.3和文件夹arm-linux-gnueabihf。在上篇博客中,我采用的是建立一个链接文件ld-linux.so.3->ld-linux-armhf.so.3。这样虽然程序时可以执行,但是执行没有任何结果,也不报错误。这就是问题所在的地方了。
我们在看一下用linaro本地编译源码得到可执行程序DisplayImage的相关信息:
root@linaro-ubuntu-desktop:/mnt/opencv_test# readelf -a DisplayImage |grep ld-li
nux
[Requesting program interpreter: /lib/ld-linux-armhf.so.3]
看到本地编译得到的程序需要的解释器是ld-linux-armhf.so.3,说明本地编译和交叉编译得到情况不一样的 。问题就想必应该猜到了。当我们利用busybox制作文件系统的时候,是把相关的工具链的/bin,/lib/等等都拷贝到ramdisk8M.gz中的。所以交叉编译过去的执行当然是一致的,所以能够正确的执行。但是linaro桌面的系统的制作,我们没有拷贝交叉工具链的相关文件,linaro自带就有gcc编译工具什么的。
所以问题的解决方法就是:
《1》 想用交叉编译得到的elf在linaro下面运行,那就需要将交叉编译工具相关的东西拷贝过去,opencv 也是交叉编译。
《2》 opencv在linaro下面本例编译源码安装,本地编译源程序,得到elf就可以在linaro下面执行。
《3》 交叉编译opencv,交叉编译程序,得到的elf在busybox下面能够正确执行。