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-4-6 17:14:15
  • 洲_仔
    不错,看了有收获
  • aUmbrella  2008-4-17 4:31:48
  • aUmbrella
    你好!我有兩個問題想請教一下,希望你能救救我:
    一、我在 嵌入式 root的根目錄裡有一個qt文件,這個qt link to /usr/qt,請問這個根目錄的qt連結,是做什麼用的?我在開發qt的過程中會用到它嗎?謝謝!
    二、最重要的問題!我使用的是qt-embedded-free-3.3.7版本。我已經把libqte-mt.so、libqte-mt.so.3、libqte-mt.so.3.3、libqte-mt.so.3.3.7放到嵌入式root根目錄下的/qte/lib裡面。 因為root裡個qt,所以無法另外創建qt資料夾 ,輸入export QTDIR /qte
    export QTEDIR $QTDIR 我只有建立/qte資料夾,那麼這裡的QTEDIR是做什麼用的?
    export LD_LIBRARY_PATH $QTDIR/lib:$LD_LIBRARY_PATH
    到我的example下執行
    #./example 出現錯誤!
    ./example: error while loading shared libraries: libstdc++.so.6: cannot load shared object file: No such file or directory
    我試過把/usr/local/arm/3.4.1/arm-linux/lib/文件夾下的libstdc++.so、libstdc++.so.6、libstdc++.so.0.1複製到/qte/lib底下 因為我在/usr/local/arm/2.95.3/arm-linux/lib下找不到libstdc++.so ,所以用3.4.1的 ,然後重新./mkcramfs root、重新上載、重新設定、
    執行./example又出現錯誤:找不到libgcc_s.so ,重新複製3.4.1下的libgcc_s.so ,
    執行./example又出現錯誤:找不到ld-linux.so.2
    最後把/usr/local/arm/3.4.1/arm-linux/lib底下的文件全部複製到/qte/lib,
    執行./example還是出現錯誤:一樣找不到ld-linux.so.2
    What can i do now
    希望你救救我,感激不盡~
  • aUmbrella  2008-4-17 17:19:09
  • aUmbrella
    為什麼無法看見我的留言?
  • 從新開始  2008-4-18 23:03:02
  • 從新開始
    aUmbrella,你好!非常抱歉,因为这两天比较忙,没有上来看,所以让你久等了!其实我也是刚入门,希望以后大家能多点交流心得!
    对于第一个问题我觉得这个连接是没用的,你检查一下它是怎么来的,或者你先把它删了,看看有没有影响,如果有影响再重新建一个连接!
    对于第二个问题肯定是库文件没搞好!这个ld-linux.so.2是一个连接文件,它指向ld-2.2.3.so这个文件,你检查一下你开发板的lib目录下有没有这个ld-2.2.3.so文件,没有的话你可以从主机的/usr/local/arm/2.95.3/arm-linux/lib/下拷贝到开发板上面,然后在开发板的lib目录下输入 ln -s ld-2.2.3.so ld-linux.so.2 建立连接即可。
    希望能帮得上忙!
  • 嵌入式在线网友  2008-4-29 9:33:15
  • 嵌入式在线网友
    你好。我也有一个问题。我已经可以在开发板上运行aclock程序了。可是,我关闭窗口后并没有回到控制台,而是就停在那了,不知你有没有遇到相同问题?怎么解决的?
  • 從新開始  2008-4-29 13:22:42
  • 從新開始
    呵呵...没遇到这种问题.要不你在控制台直接杀死进程吧!
  • maidisula  2008-5-4 13:24:05
  • maidisula
    你好,我想问问arm交叉编译环境和qt/e是怎么建立关系的,就是编译qt程序时,是怎样用的arm交叉编译环境的。
    http://www.linuxdiyf.com/bbs/viewthread.php tid 58682
    这篇文章里和你配置的不一样,我是新手,很多东西都不懂,希望您能帮我解答,谢谢了
  • 從新開始  2008-5-4 20:45:57
  • 從新開始
    maidisula,你好.
    不知道你有没有注意到在第二步的"编译QT"里面的第6点"配置QT"。 在这个配置命令:./configure -embedded arm -thread -no-cups -qvfb -depths 4,8,16,32 里的参数 -embedded 就是用来指定目标平台的,QT会根据这里的配置自动的调用交叉编译工具。比如现在我们指定目标平台是 arm ,那么这个配置生成的src/Makefile里面会自动的调用到我们的交叉编译工具arm-linux-g++.
    你说的这篇文章我看了,感觉很乱,而且他用的交叉编译工具我也没用过,不是我们常用的arm-linux交叉编译工具。
    如果你按照我上面所说的步骤一步一步来做我想一定没有问题的。有问题你再问我吧!呵呵。。。我也是刚学不久,大家以后多多交流!
  • maidisula  2008-5-4 22:14:01
  • maidisula
    非常感谢您的回答,我在网上看到有人这样配置/configure -embedded arm -xplatform qws/linux-arm-g++ -depths 4,8,12,16,这个和你的有什么区别吗?
    还有这个测试例子
    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 $QTDIR/mkspecs/qws/linux-arm-g++
    还有我在网上看到如果想用qvfb看程序运行结果,就得用x86环境,但我不知怎么用阿?谢谢了
  • maidisula  2008-5-4 22:19:36
  • maidisula
    非常感谢您的回答,我在网上看到有人这样配置/configure -embedded arm -xplatform qws/linux-arm-g++ -depths 4,8,12,16,这个和你的有什么区别吗?
    还有这个测试例子
    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 $QTDIR/mkspecs/qws/linux-arm-g++
    还有我在网上看到如果想用qvfb看程序运行结果,就得用x86环境的lib,我在编译是就是把-spec $QTDIR/mkspecs/qws/linux-arm-g++改为-spec $QTDIR/mkspecs/qws/linux-x86-g++了,但是这样会报错,说找不到/usr/bin/ld: cannot find -lqte-mt,不知为什么,我不知怎么用阿?谢谢了


验证码: 看不清?换一张