• 15391阅读
  • 10回复

轻松搭建Qt Embedded开发环境 [复制链接]

上一主题 下一主题
离线superyongzhe
 

只看楼主 倒序阅读 楼主  发表于: 2009-08-13
        想起自己当初刚开始学习Qt的那个苦恼,不知经历了多少次的失败才把开发环境搭建起来,现在就把它总结一下,希望对大家有所帮助。



一、 准备工作


1. 硬件环境

A. 主机:x86系列PC机。
B. 开发板:友善之臂mini2440。
C. 通讯连接:串口和USB。


2. 软件环境

A. 主机操作系统:VMware虚拟机下的Redhat linux 9.0(完全安装) 。
B. 开发板操作系统:嵌入式Linux,内核版本为2.6.13。
C. 交叉编译器:arm-linux-gcc-3.3.2。
D. 通讯方式:虚拟机与主机(Windows XP)使用共享文件夹通讯,主机与开发板使用DNW和Secure CRT通讯。


3. 相关说明

A. 命令:所有以#开头的均为在shell中执行的命令。
B. 交叉编译器位置:/usr/local/arm/3.3.2。
C. 工作目录:默认为/opt/qt。
D. 脚本注释:均放在命令下一行的圆括号内。


4. 下载源码包

A. 工程管理tmake-1.1.1.tar.gz,用于生成Makefile。
B. Qt/X11软件包qt-x11-2.3.2.tar.gz,用于生成qvfb等开发工具。
C. Qt/Embedded软件包qt-embedded-2.3.7.tar.gz,Qt/Embedded图形库。
D. Qt的PDA应用框架qtopia-free-1.7.0.tar.gz,可以生成一个Qt的PDA程序。


5. 编译前准备

A. 建立工作目录
#mkdir /root/qt
#cd /root/qt
#mkdir x86-qt
    (仿真开发目录)
#mkdir arm-qt
    (交叉编译目录)
#cp …
    (复制所有源码包到此目录)
B. 解压源码包
#cd /root/qt/
#tar zxvf tmake-1.1.1.tar.gz –C x86-qt
#tar zxvf tmake-1.1.1.tar.gz –C arm-qt
#tar zxvf qt-x11-2.3.2.tar.gz –C x86-qt
#tar zxvf qt-x11-2.3.2.tar.gz –C arm-qt
#tar zxvf qt-embedded-2.3.7.tar.gz –C x86-qt
#tar zxvf qt-embedded-2.3.7.tar.gz –C arm-qt
#tar zxvf qtopia-free-1.7.0.tar.gz –C x86-qt
#tar zxvf qtopia-free-1.7.0.tar.gz –C arm-qt
    (加压源码包分别到两个目录)
#cd x86-qt
#mv tmake-1.1.1 tmake
#mv qt-x11-2.3.2 qt-x11
#mv qt-embedded-2.3.7 qt
#mv qtopia-free-1.7.0 qtopia
#cd ../arm-qt
#mv tmake-1.1.1 tmake
#mv qt-x11-2.3.2 qt-x11
#mv qt-embedded-2.3.7 qt
#mv qtopia-free-1.7.0 qtopia
    (为了方便,给目录改名)


  

二、 搭建Qt/Embedded仿真开发环境


1. 安装tmake

#cd /root/qt/x86-qt
#export TMAKEDIR=$PWD/tmake
#export TMAKEPATH = $PWD/tmake/ lib/qws/linux-generic-g++
    (只用注册好tmake的环境变量皆可使用)


2. 安装Qt/X11

#cd qt-x11
#export QTDIR=$PWD
(设置环境变量)
#./configure –static –no-xft –no-opengl –no-sm
(配置,回答yes)
#make –C /src/moc
#cp src/moc/moc bin
(编译并复制moc工具到bin目录)
#make –C src
(编译Qt/X11库)
#make –C tools/designer
#cp tools/designer/designer bin
(编译Designer,用于可视化界面设计)
#make –C tools/qvfb
#cp tools/qvfb/qvfb bin
(编译qvfb,用于在PC机上仿真Qt程序)


3. 编译Qt/Embedded

#export QTDIR=$PWD/qt
#export PATH=$QTDIR/bin:$TMAKEDIR/bin: $PATH
#cd qt
(设置环境变量)
#cp /qtopia/src/qt/qconfig-qpe.h src/tools/
    (从Qtopia源码中复制配置文件)
#./configure –system-jpeg –gif –system-libpng –system-zlib –platform linux-generic-g++ -qconfig qpe –depths 16,24,32
(配置Qt/Embedded图形库,然后回答两个yes)
#make –C src
(编译Qt/Embedded)


4. 编译Qtopia

#cd ../qtopia/src
#./configure  -platform linux-generic-g++
#make


5. 编写环境变量脚本

脚本内容如下,在/opt/x86 -qt/下保存为set-env,在编译或者运行Qt程序之前进入该目录执行此脚本。
export QTDIR=$PWD/qt
export QPEDIR=$PWD/qtopia
export TMAKEDIR=$PWD/tmake
export TMAKEPATH=$TMAKEDIR/lib/qws/ linux-arm-g++
export PATH=$QTDIR/bin:$ QPEDIR/bin:$TMAKEDIR/bin: $PATH


  

三、 交叉编译Qt/Embedded图形库


首先要确保我们安装好了交叉编译器arm-linux-gcc,可以使用如下命令测试:
#which arm-linux-gcc
    (如果所显示的arm-linux-gcc的版本和路径与你所安装的一致,那么就可以用它来交叉编译Qt库和应用程序了。)


1. 安装tmake

#cd /root/qt/arm-qt
#export TMAKEDIR=$PWD/tmake
#export TMAKEPATH=$PWD/tmake/lib/qws /linux-arm-g++
    (设置tmake环境变量,即可直接使用)


2. 交叉编译Qt/Embedded

#export QTDIR=$PWD/qt
#export PATH=$QTDIR/bin:$TMAKEDIR/bin: $PATH
(设置环境变量)
#cd qt
#cp ../qtopia/src/qt/qconfig-qpe.h ./src/tools
    (从Qtopia源码中复制配置文件)
#make clean  
#./configure ./configure -system-jpeg -gif -system-libpng -system-zlib -platform linux-arm-g++  -qconfig qpe -depths 16,24,32  
(配置,然后回答两个yes)
# make -C src
(编译Qt/Embeddesd)


3. 交叉编译Qtopia

cd ../qtopia/src
./configure  -platform linux-arm-g++
make


4. 编写环境变量脚本

脚本内容如下,在/opt/arm -qt/下保存为set-env,在编译或者执行Qt程序之前在该目录执行此脚本。
export QTDIR=$PWD/qt
export QPEDIR=$PWD/qtopia
export TMAKEDIR=$PWD/tmake
export TMAKEPATH=$TMAKEDIR/lib/qws/ linux-arm-g++
export PATH=$QTDIR/bin:$ QPEDIR/bin:$TMAKEDIR/bin: $PATH


  

四、 仿真Qt/Embedded应用程序


1. 注册环境变量

#cd/root/qt/x86-qt
#source set-env
    (或者#. set-env,.和set-env之间有一个空格)
#mkdir hello
#cd hello


2. 设计界面

使用Qt/X11的可视化界面设计工具Qt Designer设计界面。
#designer hello.ui
然后设计好界面,保存并退出。


3. 生成界面代码

使用Qt的代码自动生成工具uic把设计好的界面hello.ui生成相应的c++代码:hello.h和hello.cpp。
        #uic -o hello.h hello.ui
        #uic -o hello.cpp -impl hello.h hello.ui
生成的源文件中把我们设计好的界面定义为一个类,在我们的程序中使用这个类创建对象,并设为主控件就可以了。


4. 编写代码

#vi main.cpp
    (编辑main.cpp,内容如下)
#include<qapplication.h>
#include"hello.h"
//包含我们设计的界面MainWindow类的声明

int main(int argc,char **argv)
{
QApplication app(argc,argv);
MainWindow *mainwindow=new MainWindow(0,"MainWindow");
//实例化MainWindow,MainWindow为在使用Designer设计界面时给主窗口的名称。

app.setMainWidget(mainwindow);
//把mainwindow设定为程序的主控件,在程序执行时就可以显示这个控件。

mainwindow->show();
//显示mainwindow,这样就为我们的界面显示做好准备了。

return app.exec();
}


5. 建立工程

可以使用tmake中的progen工具产生一个工程模板,然后自己修改。也可以自己写工程文件,个人觉得这样方便,下面我们就自己写一个吧!
#vi hello.pro
    (编辑内容如下)
TEMPLATE=app
#表明这是一个应用程序
CONFIG+=qtopia warn_on release
#qtopia:生成qtopia应用程序,warn_on:所有的警告全部打开,release:不带调试信息
SOURCES=main.cpp hello.cpp
#指明工程中包含的源程序
HEADERS=hello.h
#指明源程序中包含的头文件
TARGET=hello
#生成的程序名为hello



6. 编译并仿真运行程序

#tmake -o Makefile panel.pro
#make
    (这样就会在当前目录下生成hello可执行文件)
#qvfb &
    (执行Qt虚拟缓冲帧,用于仿真)
#./hello –qws
    (运行编译好的程序,在qvfb上就可以看到我们设计的界面了)


  

五、 交叉编译程序


#cd /root/qt/arm-qt
#. set-env
# cp ../x86-qt/hello .  -r
#cd hello
#tmake -o Makefile panel.pro
#make
    (把生成的hello下载到带有Qt/Embedded图形库的开发板上执行即可)


轻松搭建Qt Embedded开发环境.rar (225 K) 下载次数:142
有付出才有回报!
离线rqzrqh

只看该作者 1楼 发表于: 2009-08-14
很麻烦的样子。。
离线superyongzhe

只看该作者 2楼 发表于: 2009-08-14
如果你只想仿真的话就只需要第二章就可以了,而且可以不用编译Qtopia。
有付出才有回报!
离线hesicong
只看该作者 3楼 发表于: 2009-08-14
那对于最近的QT Embedded 4.5呢?Qtopia似乎已经很老了
离线allenli
只看该作者 4楼 发表于: 2009-08-17
借着人气问一下各位大侠,我刚开始接触QT,使用开源版QT4.5编译后能够在arm+linux开发板上运行吗?我看到商业版的下载板块有Embedded linux,而开源只有开发套件啊。
离线zhangzuoyi
只看该作者 5楼 发表于: 2009-08-19
楼主好帖,跟着楼主的步子走到 ‘3. 编译Qt/Embedded’中
#export QTDIR=$PWD/qt
#export PATH=$QTDIR/bin:$TMAKEDIR/bin: $PATH
#cd qt
(设置环境变量)
#cp /qtopia/src/qt/qconfig-qpe.h src/tools/
    (从Qtopia源码中复制配置文件)
#./configure –system-jpeg –gif –system-libpng –system-zlib –platform linux-generic-g++ -qconfig qpe –depths 16,24,32
(配置Qt/Embedded图形库,然后回答两个yes)
#make –C src

后出现
[halu@localhost qt]$ make -C src
make: Entering directory `/opt/qte/x86-qt/qt/src'
g++  -c -I/opt/qte/x86-qt/qt/include  -pipe -DQWS -fno-exceptions -fno-rtti -O2 -Wall -W -DNO_DEBUG -fPIC -DQT_NO_IMAGEIO_MNG -DQT_NO_QWS_VOODOO3 -DQT_NO_QWS_MACH64 -DQT_NO_QWS_MATROX -DQT_NO_QWS_VNC -DQT_NO_QWS_VGA_16 -DQT_NO_QWS_DEPTH_4 -DQT_NO_QWS_DEPTH_8 -DQT_BUILTIN_GIF_READER=1 -DQT_NO_IMAGEIO_MNG -DQT_NO_SM_SUPPORT  -I/usr/X11R6/include -I3rdparty/kernel -I3rdparty/tools -o allmoc.o allmoc.cpp
/opt/qte/x86-qt/qt/include/qdatetime.h:51: warning: ‘class QDate’ has virtual functions but non-virtual destructor
/opt/qte/x86-qt/qt/include/qsortedlist.h: In destructor ‘QSortedList<type>::~QSortedList()’:
/opt/qte/x86-qt/qt/include/qsortedlist.h:51: error: there are no arguments to ‘clear’ that depend on a template parameter, so a declaration of ‘clear’ must be available
/opt/qte/x86-qt/qt/include/qsortedlist.h:51: error: (if you use ‘-fpermissive’, G++ will accept your code, but allowing the use of an undeclared name is deprecated)
/opt/qte/x86-qt/qt/include/qasyncimageio.h: At global scope:
/opt/qte/x86-qt/qt/include/qasyncimageio.h:48: warning: ‘class QImageConsumer’ has virtual functions but non-virtual destructor
/opt/qte/x86-qt/qt/include/qpolygonscanner.h:48: warning: ‘class QPolygonScanner’ has virtual functions but non-virtual destructor
/opt/qte/x86-qt/qt/include/qrangecontrol.h:52: warning: ‘class QRangeControl’ has virtual functions but non-virtual destructor
/opt/qte/x86-qt/qt/include/qtooltip.h:87: warning: ‘class QToolTip’ has virtual functions but non-virtual destructor
/opt/qte/x86-qt/qt/include/qxml.h:214: warning: ‘class QXmlReader’ has virtual functions but non-virtual destructor
/opt/qte/x86-qt/qt/include/qxml.h:402: warning: ‘class QXmlContentHandler’ has virtual functions but non-virtual destructor
/opt/qte/x86-qt/qt/include/qxml.h:419: warning: ‘class QXmlErrorHandler’ has virtual functions but non-virtual destructor
/opt/qte/x86-qt/qt/include/qxml.h:428: warning: ‘class QXmlDTDHandler’ has virtual functions but non-virtual destructor
/opt/qte/x86-qt/qt/include/qxml.h:436: warning: ‘class QXmlEntityResolver’ has virtual functions but non-virtual destructor
/opt/qte/x86-qt/qt/include/qxml.h:443: warning: ‘class QXmlLexicalHandler’ has virtual functions but non-virtual destructor
/opt/qte/x86-qt/qt/include/qxml.h:456: warning: ‘class QXmlDeclHandler’ has virtual functions but non-virtual destructor
/opt/qte/x86-qt/qt/include/qwindowsystem_qws.h:223: warning: ‘class QWSServer::KeyboardFilter’ has virtual functions but non-virtual destructor
make: *** [allmoc.o] Error 1
make: Leaving directory `/opt/qte/x86-qt/qt/src'

麻烦请教下楼主,你遇到过这个问题吗,问题大概出在哪儿了,也请各位帮忙给看一下,先谢谢了!
离线tomorrowlhd

只看该作者 6楼 发表于: 2010-01-14
正在做呢!希望不会出大问题
离线吊儿郎当
只看该作者 7楼 发表于: 2010-01-23
请教一下楼主,源码包怎么下载啊?
离线luohui8891

只看该作者 8楼 发表于: 2010-01-30
源码包可以在QT官方网站下载,也可以到这个网址http://ftp3.ie.freebsd.org/pub/trolltech/pub/qt/source/
离线wdcsong

只看该作者 9楼 发表于: 2010-02-05
楼主请教一下你,为什么我把建立的工程名字改了,就编译不通过了。比如改为index,make的时候就会提示index没有定义?
离线victoire

只看该作者 10楼 发表于: 2010-04-02
开始设计学习
快速回复
限100 字节
 
上一个 下一个