Qt库的交叉编译

来源:互联网 发布:win7如何打开端口 编辑:程序博客网 时间:2024/05/22 07:40
环境:ubuntukylin-13.04-32bit
1.下载qtlib
qt-everywhere-opensource-src-4.8.5.tar.gz
2.安装交叉编译器
<span style="word-wrap: normal; word-break: normal; line-height: 21px; font-size: 14px;">#apt-get install gcc-arm-linux-gnueabihf <wbr></wbr></span>
<span style="word-wrap: normal; word-break: normal; line-height: 21px; font-size: 14px;">#apt-get install g++-arm-linux-gnueabihf</span>
3.解压qtlib
#tar -zxvf qt-everywhere-opensource-src-4.8.5.tar.gz
4.编译配置

然后就是linux下编译的三步走了,./configue   make  make install 。首先找个文件夹解压下载的qt-everywhere-opensource-src-4.8.5。打开/mkspecs/qws/linux-arm-gnueabi-g++/qmake.conf 将arm-linux-none-g(忘了,一看就知道)改为相应的arm-linux-gnueabihf就可以了,保存啊。这里又想到了一个易错点,分享给大家修改配置文件需要保存,没保存就执行可能出错。另外,我们一般先把把错误的文件删除,再重新复制一个好的文件(同名)到所在文件夹,记得要清除trash否则可能继续执行trash里的配置文件(我就是这样)。 

为了防止出现某些指令找不到的错误,例如no such instruction SWPB等指令错误,将/mkspecs/common/g++-unix.conf进行修改,将编译优化置为0,这样就可以避免了。注意-O0第一个是字母,第二个是数字。你也可以设为O2试试,据说也好使,像我这样设编译会很慢的。 

<span style="word-wrap: normal; word-break: normal; line-height: 21px; font-size: 14px;"><span style="word-wrap: normal; word-break: normal; line-height: 21px;">QMAKE_LFLAGS_RELEASE += -Wl,-O0</span><span style="word-wrap: normal; word-break: normal; line-height: 1.6em; font-family: Verdana, Arial, Helvetica, sans-serif, 宋体;"> <wbr></wbr></span></span>

好了,配置文件也改完了,可以进行配置了。进入qt-everywhere-opensource-src-4.8.5目录。

#export YOURDIR=/install_dir 

#./configure -embedded armv7 -xplatform qws/linux-arm-gnueabi-g++ -little-endian -opensource -host-little-endian -confirm-license -nomake demos -nomake examples -no-pch -prefix $YOURDIR

 (重新配置记得用#make confclean)

     这样就配置完成了,-no-pch应该可以不加,这个是预编译头文件的意思,但是我不加会在pch出错。欧了,应该没问题了。进行编译。 

<span style="word-wrap: normal; word-break: normal; line-height: 21px; font-size: 14px;">make</span>
<span style="word-wrap: normal; word-break: normal; line-height: 21px; font-size: 14px;"><span style="word-wrap: normal; word-break: normal; line-height: 1.6em;">make install</span><span style="word-wrap: normal; word-break: normal; line-height: 1.6em; font-family: Verdana, Arial, Helvetica, sans-serif, 宋体;"> <wbr></wbr></span></span>

好了,等着吧,没有优化得1个小时,在这个时间,我简单说说我对动态链接库的理解,qt交叉编译时需要相应的库的头文件以及.so文件来生产相应平台的可执行文件(头文件无所谓都一样,so文件平台相同),在arm上执行时也需要.so文件做链接。动态链接库又叫共享库,多个执行文件可以共享使用,这样可执行文件可以编译的很小了。交叉编译的目的就是编译可执行文件及其相应的动态链接库(这些都是在PC机上完成的),然后将库和执行文件拷贝到我们的嵌入式平台上(ARM,ZYNQ),执行就可以了。

/YOURID中,可以看到我们的arm动态链接库在lib下了。bin目录下有我们想要的qmake。下一步就是配置QtCreater,实现图形化的交叉编译

进入qt的options中的build&Run,需要配置Tool Chains,Qt Versions。找到arm-linux-gnueabihf-g++和交叉编译后生成的qmake的位置即可。直接上图吧。大家照着配就行了,注意我的arm-linux-gnueabihf-g++也是apt-get所在/usr/bin中(又想到了一个注意的地方如果你不是root用户,你就要去/usr/local/bin中找了)

 

ubuntukylin-13.04下玩zedboard——QT库的交叉编译

ubuntukylin-13.04下玩zedboard——QT库的交叉编译


把鼠标放到上图橘黄色处别动,可以查看详细的交叉编译链信息。

这回差不多了,修改build选项添加embeded linux配置,选gcc-arm,再编译即可了。

ubuntukylin-13.04下玩zedboard——QT库的交叉编译

Desktop可以生成和调试PC下的代码,Embedded linux就可以生成arm下的可执行文件了,就是不能调试,是不是有点贪啊,如果有实现连调的大神,请赐教。

如果没有出现上图的配置(只有Desktop),需要进入左边条的project添加Embedded Linux配置即可。

ubuntukylin-13.04下玩zedboard——QT库的交叉编译

将 /usr/share/Trolltech/QtEmbedded-4.8.4-arm/lib下的内容拷贝到ARM(ZYNQ)的相同目录下,然后需要设置动态库的调用路径了,有两种方法,首先是动态调用。

 

export LD_LIBRARY_PATH=/usr/local/Trolltech/QtEmbedded-4.8.4-arm/lib/


这样在这个terminal下执行,就可以调用动态库了。

 

系统的方法是修改/etc/ld.so.conf.d中的内容,可以新建一个qt.conf文件,将我们的库路径加进去

 

/usr/local/Trolltech/QtEmbedded-4.8.4-arm/lib

然后,在终端重新加载就行了

 

 

ldconfig


动态库的寻找路径就设置完成了,其他的库例如opencv的也可以这么做,经验是最好是和PC上相同都设为默认路径(就是上面用的那个),复制到别的地方有时ARM上会找不到。

 


上面那个PC上跑的例子,通过交叉编译生成一个hello可执行文件,你可以通过file hello的命令查看它是不是ARM的执行文件。

ubuntukylin-13.04下玩zedboard——QT库的交叉编译

好了,准备工作都完事了,可以执行了,用U盘移到ZYNQ的桌面上,然后执行

 

chmod 777 hello ./hello -qws


就可以了。结果如下图:

 

ubuntukylin-13.04下玩zedboard——QT库的交叉编译

这个例子很简单,主要测试下交叉编译环境。

(笔者使用前文的工具链编译不过)


声明:以上内容部分转载

0 0
原创粉丝点击