不知道ID:learndkid
30136次访问,排名3665好友1人,关注者1
learndkid的文章
原创 3 篇
翻译 0 篇
转载 33 篇
评论 8 篇
最近评论
mldstk:wow gold,
mldstk:wow gold,
dasdf:dfsdffg
liubaosen:configure 时要加-qvfb 选项
运行时:
qt-embedded/examples/hello -qws -display QVFb:0
liubaosen:Not bad!
文章分类
收藏
    相册
    Delphi
    Embeded
    VC
    单片机/arm
    其他
    驱动开发
    图象处理
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    转载 qte for arm的编译过程收藏

    新一篇: 电脑平面设计与印前图文处理问答(一) | 旧一篇: QtEmbedded/Qtopia FAQ

    自从接触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]

    发表于 @ 2007年04月02日 13:34:00|评论(loading...)|编辑

    新一篇: 电脑平面设计与印前图文处理问答(一) | 旧一篇: QtEmbedded/Qtopia FAQ

    评论

    #liubaosen 发表于2007-09-03 19:07:04  IP: 221.6.159.*
    Not bad!
    发表评论  


    登录
    Csdn Blog version 3.1a
    Copyright © learndkid