您的位置:首页 > 运维架构

交叉编译OpenCV2.2.0及移植到Tiny210

2015-04-10 16:35 495 查看
一、开发环境

上位机:Ubuntu10.04 LTS

交叉编译器:arm-linux-gcc4.5.1(友善之臂提供)

arm-linux-gcc-4.5.1-v6-vfp-20120301.tgz 下载地址:http://115.com/file/beeblvvn

cmake-2.8.7-Linux-i386.sh

建立交叉编译环境

在Linux平台下,要为开发板编译内核,图形界面Qtopia/Qt4,bootloader,还有其他一些应用程序,均需要交叉编译工具链,我们使用的是arm-linux-gcc-4.5.1,它默认采用armv6指令集,支持硬浮点运算,下面是安装它的详细步骤。

Step1:将光盘Linux目录中的arm-linux-gcc-4.5.1-v6-vfp-20101103.tgz复制到Fedora9某个目录下如tmp/,然后进入到该目录,执行解压命令:

#cd /tmp

#tar xvzf arm-linux-gcc-4.5.1-v6-vfp-20101103.tgz –C /

注意:C后面有个空格,并且C是大写的,它是英文单词“Change”的第一个字母,在此是改变目录的意思。

执行该命令,将把arm-linux-gcc安装到/opt/FriendlyARM/toolschain/4.5.1目录。

Step2:把编译器路径加入系统环境变量,运行命令

#gedit /root/.bashrc

编辑/root/.bashrc文件,注意“bashrc”前面有一个“.”,修改最后一行为 export PATH=$PATH: /opt/FriendlyARM/toolschain/4.5.1/bin,注意路径一定要写对,否则将不会有效。

如图,保存退出。





重新登录系统(不必重启机器,开始->logout即可),使以上设置生效,在命令行输入 arm-linux-gcc –v,会出现如下图所示信息,这说明交叉编译环境已经成功安装。



















void av_free_packet(AVPacket *pkt)

{

if (pkt) {

if (pkt->destruct) pkt->destruct(pkt);

pkt->data = NULL; pkt->size = 0;

}

}





第一次点击configure按钮时,保持generator为Unix Makefiles,选择第三个选项Specify toolchain file for cross-compiling





点击Next,Specify the Toolchain file中填入交叉编译器的默认安装路径





点击Finish,出现如下的界面,根据需要修改红色区域相应的value





我将安装目录修改为/usr/local/opencv4arm,默认的为/usr/local





































/usr/local/OpenCV-2.2.0/modules/features2d/src/sift.cpp









下图是编译后生成的静态库,大家注意看文件路径啊。





其中有5个静态库原本是在下图所示的文件夹里面的,我为了方便,之间拷贝到/usr/local/opencv4arm/lib下了





以下为一段测试程序test.cpp

// test.cpp

#include "opencv2/core/core.hpp"

#include "opencv2/opencv.hpp"

#include <iostream>

using namespace std;

int main()

{

CvCapture* capture = NULL;

IplImage* frame = NULL;

if( !(capture = cvCaptureFromCAM(-1)))

{

fprintf(stderr, "Can not open camera.\n");

return -1;

}

cvNamedWindow("video", 1);

while(frame = cvQueryFrame( capture ) )

{

cvShowImage("video", frame);

cvWaitKey(5);

}

cvDestroyWindow("video");

cvReleaseCapture(&capture);

return 0;

}

用如下参数编译

//==========error============

arm-linux-g++ test.cpp -static -o test -I /usr/local/opencv4arm/include -L/usr/local/opencv4arm/lib -lopencv_calib3d -lopencv_flann -lopencv_objdetect -lopencv_contrib -lopencv_video -lopencv_ml -lopencv_legacy -lopencv_highgui -llibjpeg -llibpng -ltiff -llibjasper
-lzlib -lopencv_imgproc -lopencv_features2d -lopencv_core -lpthread -lrt

得到如下图所示的错误信息,Why? I don't know!





链接命令中静态库的先后顺序也是有讲究的,通常来说,如果lib1.a调用了lib2.a中的函数,那么-l1就要放在-l2的前面,但这并非标准的,取决于链接器扫描命令行参数的顺序。而且如果存在多个库文件之间的循环依赖,那这个办法也会失效,这时,只有把相关的几个库文件循环写两遍

//===========ok=============

//arm-linux-g++ test.cpp -static -o test -I /usr/local/opencv4arm/include -L/usr/local/opencv4arm/lib -lopencv_highgui -lopencv_imgproc -lopencv_calib3d -lopencv_video -lopencv_core -lopencv_flann -lopencv_objdetect -lopencv_contrib
-lopencv_ml -lopencv_legacy -llibjpeg -llibpng -ltiff -llibjasper -lzlib -lopencv_features2d -lpthread -lrt

//========ok===========

//arm-linux-g++ -static test.cpp -o test -I /usr/local/opencv4arm/include -L/usr/local/opencv4arm/lib -lopencv_highgui -lopencv_imgproc -lopencv_calib3d -lopencv_video -lopencv_core -llibjasper -ltiff -lopencv_lapack -lzlib -llibpng
-llibjpeg -lpthread -lrt





http://blogimg.chinaunix.net/blog/upfile2/090115225055.gz

1. tar -xf tslib-1.4.tar.gz

2. cd tslib

3 ./autogen.sh

4. echo "ac_cv_func_malloc_0_nonnull=yes" >arm-linux.cache

5. ./configure --host=arm-linux -disable-hp3600 --disable-arctic2 --disable-mk712 --disable-collie --disable-corgi --disable-ucb1x00 --disable-linear-h2200 --with-gnu-ld --prefix=/opt/tslib ac_cv_func_malloc_0_nonnull=yes

编译QtE4.7.0

下载源码:arm-qte-4.7.0-20101105.tar.gz(FriendlyARM提供),下载地址http://115.com/file/e77r2acv

交叉编译器请使用上面提到的arm-linux-gcc-4.5.1

解压:

mkdir /opt/FriendlyARM/Tiny210/linux

tar -xvf arm-qte-4.7.0-20101105.tar.gz -C /opt/FriendlyARM/Tiny210/linux

进入所在文件夹编译 :

cd /opt/FriendlyARM/Tiny210/linux

./build-all

这个过程将十分漫长,等吧,没几个小时下不来的。提醒各位要为其准备足够的磁盘空间啊,我是在虚拟机下运行的,发现虚拟机的大小膨胀了好几个GB。

当顺利执行完毕,再运行mktarget脚本,将会从编译好的目标文件目录中,提取出必要的QtE-4.7.0库文件和可执行二进制示例,并打包为target-qte-4.7.0.tgz,把它在开发板的根目录下解压,就可以使用了,如下命令

#tar xvzf target-qte-4.7.0.tgz –C /

这样就会在/usr/local/目录下创建生成Trolltech目录,它里面包含了运行所需要的所有库文件和可执行程序。

配置Qt Creator,使其可以编译出在ARM下运行的程序。

点击菜单栏的Tools->Options->Qt4->Qt Versions(如下图)

点击右侧的蓝色“+”,即可添加自己的Qt版本,Version Name里面填入Qt版本名称,然后点击QMake Location对应的Browse寻找到该Qt版本对应的qmake

原本我添加的是一个arm版本的Qt结果不知道怎么跑到Auto-detected上面去





点击Debugging Helper对应的Rebuild按钮,如果编译通过就会在Debugging Helper旁边显示绿色的勾。很可惜,我的显示是红色的X,因为找不到arm-linux-g++。

解决办法:在/etc/profile后面加入一句话export PATH=$PATH:/opt/FriendlyARM/toolschain/4.5.1/bin

如下图所示,这样就把交叉编译器的路径设置为全局的了。再次点击Rebuild应该就可以通过了。

gedit /etc/profil





运行一个示例看看效果

从usr/local/Trolltech/QtEmbedded-4.6.2/demos下复制books例程到root/tmp文件夹下。

启动Qt-creator,File—〉Open File or Project…,打开root/tmp/books/books.pro。

这里我们直接编译arm下的,移到开发板下运行。

在Qt-creator界面左侧点击Projects图标,打开工程设置界面。

在Edit Project Settings for Project books—〉Build Settings—〉Edit
Build Configuration:单击Add,在下拉列表中选择Using Qt Version “Qt in PATH”弹出对话框单击Ok按钮,在Edit Build Configuration:下会出现蓝色的Make Qt in PATH Release active.字符,单击激活Qt in PATH Release。

设置完毕,点击Edit图标,回到编辑界面。

编译:在Build菜单下,先Clean Project “books”,然后Build Project
“books”,在右下角Compile Output窗口能看到编译信息。

复制编译好的文件books到开发板上面,执行./books
–qws。如果后面不加 - qws参数,会出现错误信息"QWSDisplay::Data::init::Invalid argument Client can't attach to main ram memory. Aborted".

然后我自己编写ARM下的QT程序,居然出现了multiple definition问题!

编译QT/E应用程序时发生的多重定义问题(multiple definition)和解决方法

首先,检查了源码,所有的头文件都进行了“ifndef/define/endif”保护,没有任何不对的地方;然后,又检查了环境变量,也正常。后来,想到我的这个项目框架代码是用QT/E的自动化工具生成的,即uic生成源码文件,progen生成pro文件,tmake生成Makefile,想到会不会是Makefile出了问题,于是检查了Makefile,确实,原因就在这个自动化生成的Makefile上。看看Makefile里面的内容,会发现OBJECTS中出现了两个camera.o,这就是导致出现这个问题的地方,其实在source和compile的地方也关于camera也出现了重复的,但是这两个会自动跳过,只需删掉OBJECTS处的重复内容保存后重新编译即可。至于自动生成的Makefile为什么会有这样的问题,我还不清楚....



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: