一、开发环境
上位机: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)
{
}
第一次点击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()
{
}
用如下参数编译
//==========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
//========ok===========
//arm-linux-g++
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
运行一个示例看看效果
然后我自己编写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为什么会有这样的问题,我还不清楚....