Qt4.5.2 在ARM平台交叉编译的搭建、移植详解

 

一、Qt嵌入式开发平台的建立
概述:Qt嵌入式开发平台包括:
1、Qt-X11开发平台:(即为我们平时开发Qt应用程序时使用的系统平台)。
2、Qt/Embedded-4.5.2开发平台(即framebuffer):该平台可以让Qt程序在pc机上模拟在嵌入式平台的运行情况,一般在Qt/Embedded上模拟运行成功后才,进行交叉编译。
3、Qt/Embedded-4.5.2-arm交叉编译平台:在此平台下编译通过的Qt程序就可以移植到arm板上运行了。
step1:
   建立Pc开发平台(x11、redhat9的桌面就属于X11):
   下载Qt4.5.2pc开发包qt-x11-opensource-src-4.5.2.tar.gz (下载地址:ftp://ftp.trolltech.com/qt/source/)

   #tar xzvf qt-x11-opensource-src-4.5.2.tar.gz
   #cd qt-x11-opensource-src-4.5.2
   #./configure -qvfb  
   #make

#cd tools/qvfb

#make

#cd ../..

#make install
   安装好后,系统默认安装在/usr/local/Trolltech/Qt-4.5.2目录下
   检查环境变量:
   #which qmake   

复制文件

进入/usr/local/Trolltech会看到一个Qt-4.5.2的目录,将 /home/tools/qt-x11-opensource-src-4.5.2/bin/目录下的qvfb相关文件拷贝到/usr /local/Trolltech/Qt-4.5.2/bin目录下

#cp qvfb* /usr/local/Trolltech/Qt-4.5.2/bin

     注意:在configure时有可能会报如下的错误提示:

Basic XLib functionality test failed!

You might need to modify the include and library search paths by editing

QMAKE_INCDIR_X11 and QMAKE_LIBDIR_X11 in /usr/include/qt/qt-x11-opensource-src-4.5.2/mkspecs/linux-g++.

有两个原因会造成这个错误(具体的错误信息可以进config.test/x11/xlib 执行make命令)

1、没有安装libxext和libX11-dev

2、安装了但路径与QT设置的不一样,这时你需要根据提示修改mkspecs/common/linux.conf中的宏定义
step2:
   建立qt-embedded -4.5.2编译平台(此时编译器仍然用的是默认的gcc)
   #tar xzvf qt-embedded-linux-opensource-src-4.5.2.tar.gz
   #cd qt-embedded-linux-opensource-src-4.5.2
   ./configure -embedded x86 -qvfb -qt-gfx-qvfb -qt-kbd-qvfb -qt-mouse-qvfb
   #make install    
   安装完成后usr目录多了一个文件夹/usr/local/Trolltech/QtEmbedded-4.5.2就表示安装成功了
  step3:
   qt-embedded -4.5.2-arm交叉编译平台的建立(此时不是用系统默认的gcc来编译了)
   #tar xzvf qt-embedded-linux-opensource-src-4.5.2.tar.gz
   #cd qt-embedded-linux-opensource-src-4.5.2
   #./configure -embedded arm   //注意几个选项,必须加上 -embedded arm选项
   #make install 
   安装完成后usr目录多了一个文件夹/usr/local/Trolltech/QtEmbedded-4.5.2-arm就表示安装成功了
   注意:如果你的arm平台用的不是arm-linux-g++的编译器,则需修改mkspecs/qws/linux-arm-g++/qmake.conf
step4:
   设置环境变量:环境变量的设法总的说来有4种(export、profile、.bashrc、.bashrc_profile)具体看自己情况来定
   #vi /root/.bash_profile  //在环境变量的最前面加上一句:

PATH=/usr/local/Trolltech/QtEmbedded-4.5.2 /bin:$PATH
   #source /root/.bash-Profile   //使环境变量生效

   好了平台已经搭建好了,可以用他来编译Qt程序了
   注意:如果要编成arm平台的程序,需将环境变量改为

PATH=/usr/local/Trolltech/QtEmbedded-4.5.2-arm/bin:$PATH    设置虚拟屏幕

#export DISPLAY=:0.0

# qvfb &           //运行qvfb
step5:
   用qt-embedded -4.5.2来进行编译,在x86上运行程序

以hello例子,其源程序如下:

#include <QApplication>

#include <QLabel>

int main(int argc, char *argv[])

{

  QApplication app(argc, argv);

  QLabel *label = new QLabel("Hello Qt!");

  label->show();

  return app.exec();

}

将上面内容保存为hello.cpp
   #qmake -v  //检查自己的qt环境变量是否正确,如果不正确的话,就返回第4步
   #cd myqtprogram   //进入自己写的qt程序
   #qmake -project   //生成.pro工程文件
   #qmake           //生成Makefile
  #make             //生成执行程序

#./myqtprogram  -qws  //运行程序
  如果要生成arm平台的程序,可通过修改环境变量,使 用qt-embedded -4.5.2-arm来进行交叉编译,使其生成arm平台的程序
step6:
   如果要在arm板上运行QT程序,在进行交叉编译后,查看自己写的Qt程序需要用到哪些库文件资源。
   #ldd  myqtprogram

如果不支持ldd命令,可以使用arm-linux-readelf -a -myqtprogram | grep Shared  //Shared首字母大写;
   
step7:
   拷贝库文件:
   根据上一步提示把Qt程序要用到的资源文件拷到自己制作的根文件系统中,以下是按本人写的Qt程序所需要的库写的
   将程序移植到arm板运行
   拷贝库文件到自己制作的root系统中(注意:拷贝时一定要看看大小,千万不要拷到连接文件(相当于快捷方式)了)
   #cd usr/lib   
   #cp /usr/local/Trolltech/ QtEmbedded-4.5.2-arm /lib/libpng*  ./                  //把图形库考过去,否则图片显示不了,强烈建议用png、bmp格式的图片,用其他格式的图片的话,否则你还要自己做连接库
   #cp /usr/local/Trolltech/ QtEmbedded-4.5.2-arm /lib/libQtCore.so libQtGui.so  ./     //这2个库不用说一定要考的
   #cp /usr/local/Trolltech/ QtEmbedded-4.5.2-arm /lib/libQtNetwork.so  ./           //和网络相关的库
   #cp /usr/local/Trolltech/ QtEmbedded-4.5.2-arm /lib/libstdc++.so  ./
   #cd ../    //以下是在根文件系统qt-root/usr/local/下制增加一个Trolltech/ QtEmbedded -4.5.2-arm/lib/fonts路径目录并添加相应的字体文件,否则在arm板上会出错显示不了字
   #mkdir local/Trolletch
   #mkdir local/Trolletch/QtEmbedded-4.5.2-arm
   #mkdir local/Trolletch/QtEmbedded-4.5.2-arm /lib
   #cp /usr/local/Trolltech/QtEmbedded-4.5.2-arm /lib/fonts local/Trolletch/QtEmbedded -4.5.2-arm/lib  //注意不要拷错路径了
step8:
   把程序下载到arm板运行

注意:如果arm板上液晶显示的设备不是/dev/fb0,则需链接过去, 否则运行时会提示找不到fb0
 
   #./myqtprogram -qws   //-qws表示以服务器模式运行
   ok能在板子上跑起来了

 

常见问题解决方法:

1、运行QT程序报如下错误

Qt for Embedded Linux data directory is not owned by user 520h

解决方法是将/tmp目录下的qtembedded-0目录删除。造成该错误是因为用户没有该目录的权限。