qte for arm的编译过程

12 篇文章 0 订阅
自从接触qte以来,便觉得qte在众多嵌入式GUI中算上层的,其构建很清晰,充分利用了c++的继承、多态等,读了部分源码很有收获。写应用程序还可以在pc上用qt designer,在写GUI程序的时候很方便,想把程序放到板上去跑,很容易,在qmake的时候加上-spec cross就可以了。
 
现在我把以前如何交叉编译qte,和在交叉编译中遇到的问题以及如何解决等大概整理一下。
 
先到 http://ftp.citkit.ru/pub/qt/source/去下载了qte-3.4的源码,解压,先cp一份,并把其中一份命名为qte-arm,因为我们需要先编译pc上的qte,得到两个工具,bin/moc、bin/uic,我们写的qte程序里面的信号糟等,需要用moc工具来“解析”(具体的可以去qiliang的主页看看),而我们的目标环境是arm,所以我们编译出来的moc工具是arm-elf格式的,这在X86的机子上是不能运行的。uic工具是在编译QT时候生成的,它可以把Designer设计的界面文件(*.ui)转换成为相应的C++文件(*.cpp和*.h),然后让gcc进行编译,(这个倒不是很重要,因为我们在写代码的时候根本没用qt designer ^_^)。编译pc上的qte很容易,直接一个./configure就行了,当然也可以自己去配置各自需要的东西,不过我们的重点在于qte for arm。
 
把qte-host中的bin/moc、bin/uic copy到qte-arm的bin下面,接着就可以开始编译qte for arm了。
当然,我们要有arm的交叉编译器,如果没有,自己去找一个,找不到的话自己去编译一个。
在pxa255B上有自带的arm-linux-编译器,在其lib下面也有很多arm的库,这可以节省很多工作了。因为在交叉编译qte时需要很多其他的库,例如:jpeg.so、stdc++.so、libuuid.so(这个是在交叉编译qpe的时候需要)等。刚开始的时候由于缺少了stdc++.so,在编译的时候老是出现错误,ld:can't find stdc++,一般的交叉编译器工具都会有stdc++.so的, 很不幸我们这个没有。后来自己去整出了一个交叉编译器,也是2.95.3的,库的版本一定要一致,不然也是会出错的,没想到整出来的的stdc++是一个静态库,不料静态库的也行,奇怪ing...
 
1)先export环境变量
比如:
export QTDIR=/qte/qte-3.3.4
export QTEDIR=$QTDIR
export PATH=$QTDIR/bin:$PATH
export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH
 
2)我建议在编译前先把./configure -help看熟悉了,这样任务已经完成一大半了。
我的configure配置如下:
./configure -embedded arm -shared  -no-cups  -thread -no-stl -qt-libpng -system-libjpeg -qt-libmng -qt-imgfmt-jpeg -disable-network -disable-sql -disable-xml -qt-mouse-linuxtp -qt-kbd-key -qvfb -depths 4,8,16
下面我一一解释一下:
-embedded arm 是表示目标环境是arm
-no-cups 是表示不用打印这个功能,一般都是加上这个的,因为很少有打印的库。
-thread 需要多线程
...其实所有的参数是看一下./configure -help的输出就都明白了,我就不翻译了。
在这里需要注意的是-system-libjpeg -qt-imgfmt-jpeg -qt-mouse-linuxtp -qt-kbd-key这几个配置,这些都是和项目相关的。
 
刚开始我想qte支持png、jpeg、mng等格式,就加上了-qt-libmng、-qt-libjpeg、-qt-libpng,没想到编译出来的qte库只支持png,我们可以用命令readelf来查看qte库都支持哪些功能:
readelf -a libqte-mt.so.3.2.1 | grep png
 
输出了一大堆的关于png的函数和变量,这说明了qte库支持png,但是我把上面的指令中的png改为jpeg,只输出了一个函数,why?
我到src/Makefile里面去看看,发现原来编译的时候关于jpeg的只是编译了qjpegio.cpp,而关于png的不止有qpngio.cpp,还有src/3rdparty/libpng目录下的一大堆源程序,但是为什么src/3rdparty/libjpeg里面的源程序就不编译进去呢?
我看了一下3rdparty里面的Makefile,内容如下:
PNGMAK=scripts/makefile.linux

all:
        cd zlib; ./configure; make
        cd libpng; make -f $(PNGMAK)

clean:
        -cd zlib; make clean
        -cd libpng; make -f $(PNGMAK) clean

很明显是Makefile的问题,那为什么Makefile里面就不包含jpeg的呢?如果要改那该如何改呢?无奈何,再去仔细地看一遍help,果然,我漏掉了这个配置-plugin-imgfmt-<format>, (-plugin-imgfmt-<format> Enable <format> to be linked to at runtime)所以我加上了-system-libjpeg -qt-imgfmt-jpeg ,表示要用系统的jpeg库。
 
-qt-mouse-linuxtp -qt-kbd-key这两个配置是和触摸屏和按钮有关的,这两个后面再介绍了。
 
3)然后make sub-src
这一步是编译生成库文件,但不编译其他的(如tools、examples目录下的东西)。
编译完成会在lib目录下生成库
比如(有thread支持的是libqte-mt.so):
libqte.so -> libqte.so.3.3.4
libqte.so.3 -> libqte.so.3.3.4
libqte.so.3.3 -> libqte.so.3.3.4
libqte.so.3.3.4
上面编译出来的qte库只有7M多,有的人编译出来的有30多M,这主要是配置参数-debug、-release的作用。一般默认的是-release,编译生成的库会很小。
 [http://blog.chinaunix.net/u/8800/showart.php?id=114705]
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值