Arm-Linux嵌入式QT3/Embedded开发环境的建立

Arm-Linux嵌入式QT/E环境的建立(qt/e 3.x系列)

         QT/E 3.x系列比QT/E 2.x系列有非常大的改进,大大提高了开发进度,不再使用tmake,安装也更简单。但目前在网上关于QT/E 3.x系列的介绍还是比较少,所以本文介绍一下QT/E 3.x系列的安装。

一、建立arm交叉编译工具链

       在安装QT/E之前,应确保arm-linux交叉编译工具链已经建立,如果还没有可以参考以下步骤建立。

     1、下载交叉编译工具cross-2.95.3.tar.bz2(或其他版本如:cross-3.4.4.tar.bz2),这是已经制作好的arm交叉编译工具链,只需解压及建交环境变量即可使用。

     2、把文件cross-2.95.3.tar.bz2拷贝到一个文件夹,这里我用:/usr/local/arm这个目录。 注意后面建立环境变量时要与之对应。

      3、解压 tar   -xjvf    cross-2.95.3.tar.bz2

      4、建立环境变量 export    PATH=/usr/local/arm/2.95.3/bin:$PATH

或者也可以写进文件 ~/.bashrc中,这样就不用每次开机都export啦。

             vi     ~/.bashrc

             在后面加上 export    PATH=/usr/local/arm/2.95.3/bin:$PATH

     到此arm-linux交叉编译工具链就已经建好了。

二、编译QT

        1、QT/E自由版可到官网ftp下载。网址是:ftp://ftp.trolltech.com/qt/source/ 。可自己选择一个版本下载,个人认为QT/E 3.x系列比较好用,不过QT/E 2.x系列在网上的资料比较多。但建议不用qt/e 3.3.x 的版本,因为在本人开发的过程当中试用过qt/e 3.3.4和qt/e3.3.8,发现它们在ARM开发板上占CPU的资源特高,一直占cpu 98%左右,现在我还没找到原因,不知道有没有哪位朋友也遇到这个问题。推荐用qt/e 3.1.0版本,我正在用,没遇到什么问题。

(注:问题已经得到解决,原来是键盘接口没做好,等有空与大家分享一下移植键盘接口的过程)

         2、在这里,本人假设用的是 qt-embedded-free-3.1.0.tar.bz2

         3、把文件qt-embedded-free-3.1.0.tar.bz2 拷贝到一个文件夹,这里我用:/usr/local/arm这个目录。 注意后面建立环境变量时要与之对应。

         4、解压 tar   -xjvf   qt-embedded-free-3.1.0.tar.bz2  

             把解压后的文件夹qt-embedded-free-3.1.0改为qte。(可以不改,这里是为了方便,注意后面建立环境变量时要与之对应)   

                        mv     qt-embedded-free-3.1.0     qte

         5、建立环境变量

                       vi     ~/.bashrc

               在后面加上

                       export QTDIR=/usr/local/arm/qte
                       export QTEDIR=$QTDIR
                       export PATH=$QTDIR/bin:$PATH
                       export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH

              (请重新登陆,以使得环境变量生效)

          6、配置QT

            进入QT/E目录:     cd    $QTDIR

              输入:   ./configure  -embedded  arm   -thread  -no-cups -qvfb -depths 4,8,16,32


            上述选项: -embedded  arm 指目标平台为arm; -thread 表示支持qt线程,本人开发当中用到; -qvfb 表示支持虚拟缓冲帧工具qvfb;-depths 4,8,16,32 表示支持4,8,16,32 位的显示颜色深度。还有很多选项就不一一列举,请查看 ./configure  -help。

         此外还有一个选项我没用的是 -qconfig  local,你可以把一些开关变量写到一个文件qconfig-local.h 中,并把它放到$QTDIR/src/tools下。可参考这个目录下的qconfig-small.h、qconfig-medium.h 、qconfig-large.h等文件,直接使用它们也行,如:  -qconfig  small 。通过这些开关变量,可以把一些开发当中用不着的构件去掉,减少qt库的大小。这里要对QT比较熟练,初学者可先不理。


            (本人在家里编译到这里曾出现编译 $QTDIR/include/qvaluestack.h 这个文件的时候出错,后来把qt3.3.8对应的文件拷贝过来覆盖便通过了,估计是与gcc的版本不兼容的问题,我在公司里没出现过这种问题)

         7、编译

            make sub-src      // 指定按精简方式编译开发包,也就是说有些Qt 类未被编
译。

          8、测试

                  至此编译工作完成,最后测试一下是否能正常使用。我们可以用QT自带的例子来测试,如:

                  cd  $QTDIR/examples/aclock      //或你自己新建一个QT工程也行

                  make clean                              //把原来的清掉

                   rm    *.pro      Makefile                       //删掉,重新建立工程文件

                   qmake   -project

                    qmake   -spec  $QTDIR/mkspecs/qws/linux-arm-g++   -o  Makefile           

                -spec指定目标板的配置文件,这里我做的是linux arm平台,注意在这里,$QTDIR/mkspecs/qws/linux-arm-g++ 它不是编译器,是一个配置文件,而编译时用的编译器是我们在第一步建立的arm交叉编译工具链里面的编译器。 

                   make                      

             如果没出错就表示你的QT/E环境已经成功建立。如果提示说cannot   find   -lqte, 那么你试一下修改Makefile文件,找到-lqte ,把它改为-lqte-mt再make一次一般就行了。这是因为如果用到QT线程或其它一些原因,它生成的库不再是libqte.so.3.1.0,而是libqte-mt.so.3.1.0,所以它便找不到了。

三、移植到开发板(以下都是在目标机环境下)

        1、新建一个目录,如:/qt/lib。进入此目录 cd   /qt/lib

        2、通过 ftp  把上面生成的qt库文件libqte-mt.so.3.1.0下载到开发板/qt/lib/目录下。(注意:不要用wget 下载,会破坏库文件,从而出现  ld.so: dynamic-link.h: 62: elf_get_dynamic_info: Assertion `! "bad dynamic tag"'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' failed!.这种错误

        3、创建qt库连接:

                ln   -s   libqte-mt.so.3.1.0     libqte-mt.so

                ln   -s   libqte-mt.so.3.1.0     libqte-mt.so.3

                ln   -s   libqte-mt.so.3.1.0     libqte-mt.so.3.1

        4、建立环境变量

                       vi     ~/.bashrc

               在后面加上

                       export QTDIR=/qt
                       export QTEDIR=$QTDIR
                       export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH

           4、到此目标板的环境已经建好。现在可以把上面的例子aclock下载到目标板上试一下能不能跑起来!

             在开发板控制台下输入:  ./aclock  -qws 

             如果能跑起来但是键盘用不了,那是正常的情况,因为键盘、鼠标等设备的接口还没加进QT/E的原因,而这个不是一两句话能说清的,所以留到以后再另外补充!

补充一点:如果有类似这样的提示:  "./aclock: error while loading shared libraries: libstdc++.so.6: cannot load shared object file: No such file or directory." 你可以从我们第一步建立的arm交叉编译工具链里的/usr/local/arm/2.95.3/arm-linux/lib/目录下找到相应的库文件下载到开发板的 /lib 目录下即可。

投 票

觉得本文不错,投一票   

评 论

  • 從新開始  2008-5-5 9:40:10
  • 從新開始
    maidisula,你好.
    对于第一点,请你看配置命令的帮助吧,说得很详细.在qte目录下输入 ./configure -help 就可以看到了!
    你说的这个配置是重复的,因为-embedded arm默认就是使用 -platform qws/linux-x86-g++ -xplatform qws/linux-arm-g++这两个选项,只有当你用的不是标准的arm-linux交叉编译工具时你才需要指定-xplatform .
    对于第二问题,虽然我们编译QTE时指定了是为ARM平台编译,生成的库也是ARM平台的库,可是QTE的默认编译环境并没有改变.在mkspecs目录下有一个default的连接文件,通常它是指向qws/linux-x86-g++,所以我们要么把这个default连接文件指向qws/linux-arm-g++,要么在编译工程的时候使用参数-spec 指定.
    你把 -spec 指向linux-x86-g++当然是不行的,因为我们编译QTE所生成的库是ARM平台的库,不是X86的,你需要另外再编译一个X86的库.
    qvfb这个工具我也没用过,我一般是先用系统自带的QT软件把程序做好了,最后才用QTE编译一下放到开发板上运行,再根据需要修改一下.
  • maidisula  2008-5-5 10:50:31
  • maidisula
    真是太感谢您的回答了,解答了我的很多疑问,谢谢了
    1-如果在qte里用不到linux-x86-g++,为什么还会有这个选项呢?
    2-“你把 -spec 指向linux-x86-g++当然是不行的,因为我们编译QTE所生成的库是ARM平台的库,不是X86的,你需要另外再编译一个X86的库.”--如果使用x86的库是不是就不能使用qte里的库了,应该使用qt里的库?使用的是g++编译器?那如果是这样的话不就用不到qvfb了吗,这样编译出的程序不就直接可以运行吗比如helloworld的例子。
    3-你的那个开发板里带系统吗,我看你的操作好像是开发板里的是linux操作系统,用到了cd 等命令,我想问一下
    “、新建一个目录,如:/qt/lib。进入此目录 cd /qt/lib ”这个操作是在pc机上操作的吗,是通过什么方式进行操作的呢?如果我现在有一个开发板,没有任何系统的,那我该怎样把编译好的程序放到开发板上运行?是不是我还要个开发板安装操作系统?
    呵呵,问出很菜的问题,我是学电子的对单片机了解一些,对arm开发版了解一点,但是从来没有做过实验,因为没有开发板。还有一个问题如果我想开发关于dsp的程序,那在linux下应该用什么工具啊?
    4-我在linux下用eclipse开发过gtkmm的相关程序,不过也是初级,qte是要收费的,那能不能用交叉编译环境,eclipse,和gtkmm,去开发和qte一样功能的程序呢?
    5-现在最好的linux嵌入式开发环境是什么啊?
    呵呵,一口气问了这么多问题, 感觉太麻烦您了,谢谢了。
  • 從新開始  2008-5-5 12:09:04
  • 從新開始
    呵呵。。。没关系,不用这么客气。
    1、在编译QTE的时候用到了linux-x86-g++,如果你注意一下编译QTE时打印的信息就可以发现,请你自己仔细看一下吧。
    2、你自己动手做一遍吧,我想是可以的,可是我也没弄过,因为我用不着啊。
    3、QT程序是必须跑在操作系统上的,所以你得先在开发板上移植一个操作系统,我现在在开发板上移植了linux操作系统,第三步“移植到开发板”的所有操作都是在开发板上进行的!
    我现在也正在学DSP,还不是很清楚怎么开发,如果你知道用什么工具还请告诉我一下。呵呵。。。
    4、QTE也有开源版啊。不过你说的这个问题我想应该可以,如果你能开发出来我想你可以开一家公司了,哈哈。。兄弟,努力啊!
    5、不知道怎么回答你,我觉得合适的就是最好的!每家公司,每个项目的情况都不同,所以很难说什么是最好的!
  • maidisula  2008-5-5 15:20:23
  • maidisula
    哦,那如果都是在开发板上作第三步的话,那有键盘吗,开发板上用的什么键盘啊,和pc机的一样吗,它是什么接口的呢?
    4、到此目标板的环境已经建好。现在可以把上面的例子aclock下载到目标板上试一下能不能跑起来!
    在开发板控制台下输入: ./aclock -qws
    如果能跑起来但是键盘用不了,那是正常的情况,因为键盘、鼠标等设备的接口还没加进QT/E的原因,而这个不是一两句话能说清的,所以留到以后再另外补充!
    键盘、鼠标等设备的接口要怎样才能计入QTE啊,什么时候补充阿,呵呵
    谢谢
  • 從新開始  2008-5-5 17:48:15
  • 從新開始
    呵呵...键盘、鼠标等外设是根据自己项目的情况确定的,键盘一般和pc机的是不一样的,一般来说不需要那么的按键,你们没有学 微机原理 吗 里面用什么接口都说得很清楚.
    我已经在另一篇文章里面单独的把QTE的键盘、鼠标等设备的接口添加过程写了下来,有兴趣的你可以看一看啊.不过搞嵌入式如果没有一套开发板做实验的话是很难学的!学这个东西就得多动手!呵呵...
    http://blog.mcuol.com/User/lyusheng/Article/4686_1.htm
  • 嵌入式在线网友  2008-5-6 13:24:22
  • 嵌入式在线网友
    我现在在作软件,很长时间不看这些东西了,基本都忘了,呵呵,那你的键盘是自己买的,就是买开发板带的还是自己作的?
    我的画图软件是qt4,潜入式版本是qtopia-core4.33,好像都是最新版,不过它们的资料就要少一些了。
    不知qte3.8和qtopia-core4.33有什么区别?你用过吗?
  • benjamin258  2008-5-21 15:08:44
  • benjamin258
    你好,我是刚学不久,想请教几个问题。不胜感激!
    1、我现在用的是fedora8自带的qt3.3写了个程序,想移植到2440的开发板上,用qt3.3自带的qmake能交叉编译开发板上运行的程序么? 需要再装qt-embedded吗? 或者是别的什么库?
    2、交叉编译工具链用什么版本的?我有2.95.3,3.3.2和3.4.1,这几个版本有区别么?
    3、qmake -spec $QTDIR/mkspecs/qws/linux-arm-g++ -o Makefile时,我的qt这个文件夹下没有linux-arm-g++,只有linux-g++,是不是库没装全?
  • 從新開始  2008-5-21 15:50:35
  • 從新開始
    benjamin258,你好.
    1、当然要重新再装qt-embedded,因为qt-embedded和qt-x11是针对不同领域的
    2、这三个交叉编译工具链的版本都可以吧,我用的是2.95.3。区别主要就是用的GCC版本不同啊,新的GCC版本会加入很多新的特性,因为linux内核是建立在GCC编译器的基础上的,所以不同的内核要与不同的编译器版本相配,不然会编译通不过的。
    3、QT里的这两个文件linux-arm-g++和linux-g++与库无关,它只是一组编译规则,类似Makefile一样的文件,你可以自己写的。不过QT一般会带一些常用的,如linux-arm-g++,当然这个好像只有在qt-embedded系列才带有。
  • benjamin258  2008-5-23 11:45:23
  • benjamin258
    多谢斑竹!我还有一些问题
    1、我是arm9的2440,那我应该用哪个版本的编译器?
    2、我装的是qtembedded3.3.3,在开发板建立库的时候libqte-mt.so.3.3.3太大,拷不到板子上啊?还有输入ln -s libqte-mt.so.3.1.0 libqte-mt.so.3.1时提示找不到命令?第三步我都是通过超级终端在板子上操作的。
    3、在make的时候,会提示main.cpp中的form没有定义,这为什么啊?是编译器的问题么?我把form w;这句删了之后就可以编译了,但是这样是不是有问题?
    麻烦斑竹了!
  • 從新開始  2008-5-23 19:08:47
  • 從新開始
    benjamin258,你好.不用客气!
    1、看你打算用什么版本的linux内核了,如果是较新的内核,如linux-2.6.x的最好用3.3.2版以上的交叉编译工具链了,如果是只linux-2.4.x的用2.95.3都可以了,我现在用的内核就是linux-2.4.x的,用2.95.3都够用了。其实如果只是编译qt-embedded-3.x,用2.95.3都没问题的。没必要在这些问题上花太多精力,能用就用,不能用就再换一个。
    2、如果不对qt-e裁剪的话QT库文件会达到7~8M,不过裁剪以后可以减到1~3M。如果你需要的话可留个邮箱,我把我的配置文件发过去给你参考。
    ln这个程序我一般集成在busybox里面,不知道你开发板上跑的系统是否移植了这个程序。我想应该是没有。
    3、第三问题不是很明白你用的是什么例子,不过这和编译器肯定是没关系的,应该是这个程序有问题。检查一下。


验证码: 看不清?换一张