这两天终于在linux下搞定了qt的移植,以及qwt控件的安装。现在把整个过程整理出来。实际上,这篇帖子是我整理到一个word文档中的,文档现在已经上传到了csdn的资源中,链接是http://download.csdn.net/detail/zxzxy1988/3700961,那里面有各种图片,而这里由于csdn的blog限制,没有把图片贴出来,请大家见谅
另外说明的是,因为有一些地方时间太过久远了,所以不详细之处请大家见谅,并且请在帖子后面跟帖说明哪个地方不详细或者有错误,我再进行修正。
目录
Linux环境下移植qt4及qwt从零开始... 1
一、 名词解释... 4
1. Trolltech. 4
2. Qt. 4
3. Qt designer & qt creator. 4
4. Qt/E. 4
5. Qtopia. 4
6. Qtopia Core. 4
7. 环境介绍... 5
二、 X86平台IDE安装(主要包括qt designer和qt creator)... 6
三、 X86平台、ARM平台编译环境搭建... 7
1、 建立linux开发环境... 7
2、 编译及安装qt-x11-opensource-src-4.5.3. 7
3、 编译及安装qt-embedded-linux-opensource-src-4.5.3 x86版本... 7
4、 编译及安装qt-embedded-linux-opensource-src-4.5.3 ARM版本... 8
5、 编译qvfb. 8
6、 上面步骤的解释... 9
7、 设置环境变量... 9
8、 做一个测试(X86上的)... 10
9、 Qt4arm版本文件系统移植到mini2440上... 10
10、 运行效果... 12
四、 结合IDE进行X86下程序开发... 13
1. 建立新工程... 13
2. 选择一个对话框做模板。... 14
3. 更改文件名... 14
4. 添加标签... 15
5. 编译... 15
6. 添加main.cpp. 18
五、 将X86平台下的程序移植到arm上... 19
1. Qt-creator开发环境的配置... 19
2. 一个例子... 19
3. x86下的编译与调试... 20
4. arm编译并移植... 20
六、 Qwt移植及开发... 22
1. 安装qwt. 22
2. 将生成的库文件变为全局可用... 22
3. 测试示例程序... 22
4. 在qt creator中加入这个插件... 23
七、 Qwt图表程序示例... 24
首先介绍几个名词,这也是初学者经常搞混的东东。
是一个公司,专门进行qt开发,后来被nokia收购了~
Qt泛指Qt的所有桌面版本,比如Qt/X11,Qt Windows,Qt Mac等。由于Qt最早是在Linux中随着KDE流行开来的,因此通常很多人说的Qt都指用于Linux/Unix的Qt/X11。
Qt分为好多版本,比较流行的就是qt3和qt4。
一般情况下,qt4包括qt designer和qt creator。前者是用来设计界面的,后者主要是一个IDE,可以建立工程,编译工程等。
Qt/E(Qt/Embedded)最初是用于嵌入式Linux系统的Qt版本。Qt/E去掉了X Lib的依赖而直接工作于Frame Buffer上,因而效率更高。最简单的理解方式:这是一个可以运行在资源相对较少的嵌入式系统上的程序
Qtopia最初是sourceforge.net上的一个开源项目,全称是Qt Palmtop Environment (QPE),是一个构建于Qt/E之上的类似桌面系统的应用环境,包括了PDA和手机等掌上系统常见的功能如电话簿、日程表等。相比之下,Qt/E是基础类库。在QT4版本前要安装Qtopia需要先装Qt/E,但之后的就不需要了。版本4之后的Qtopia 已经带有QT/E库了。简单的理解,qtopia就是一个建立在QT/E上面的应用基础类程序(因为当时设计的时候主要是给PDA使用的,因此有相对丰富,并且有针对性的应用程序)
Qtopia Core:就是原来的Qt/E,从Qt 4开始改名为Qtopia Core,把Qtopia Core并到Qtopia的产品线中去了。在版本4之前,Qte和Qtopia是不同的两套程序,Qte是基础类库,Qtopia是构建于Qte之上的一系列应用程序。但从版本4开始,Trolltech将Qte并入了Qtopia,并推出了新的Qtopia4。在该版中,原来的Qte被称为Qtopia Core,作为嵌入式版本的核心,既可以与Qtopia配合,也可以独立使用。原来的Qtopia则被分成几层,核心的应用框架和插件系统被称为 Qtopia Platform,上层的应用程序则按照不同的目标用户分为不同的包,如Qtopai PDA,Qtopia Phone。但实际上Qtopia Core就相当于原来的Qt/E,仍然作为基础类库。从Qt4.4开始,其名称又改回Qt-embedded了,之前的Qtopia改名为Qt Extended了。
本文所实验的环境是ubuntu11.04和友善之臂mini2440平台。其他平台原理应类似,缺少库文件之类的请自行解决:)
请在qt官网上面下载qt安装包:
http://qt.nokia.com/downloads/sdk-linux-x11-32bit-cpp
这是x86环境下的在线安装包,也可以自行根据自己的机器配置选择,或者安装离线安装包。大概需要4个小时左右。
按照网站上的说明,先修改下来的 .run 文件的权限,然后运行即可。全部安装完成后,会在applications-programming里面生成qt creator 和 qtdesigner.
至此,本步骤轻松结束。
另,如果是ubuntu的话,也可以在ubuntusoftware center中搜索qt安装,效果一样,我采用的是后者。
1.交叉编译器:版本较多,现在常用的是arm-linux-gcc-4.3.2.或者arm-linux-gcc-4.1.2
2. QT版本:qt-embedded-linux-opensource-src-4.5.3.tar.gz和qt-x11-opensource-src-4.5.3.tar.gz
3.触摸屏支持tslib
4.Linux系统上的一些编译工具或者库
按照《micro2440用户手册》中,第五章《建立linux开发环境》所述,将NFS、交叉编译工具arm-linux-gcc、触摸屏tslib等(主要是这三个方面)都配置好。
qt-x11版本可以产生Qt开发工具,如designer等等,最重要的是可以得到qvfb,嵌入式的开发有了qvfb,就可以不需要实际的开发板,也可以开发Qt应程序。qt-embedded版本就是专门用于嵌入式方面的版本。
tar xjvf qt-x11-opensource-src-4.5.3.tar.bz2
cd qt-x11-opensource-src-4.5.3
./configure (4分钟)
make (近2小时)
make install
历经漫长的编译过程,默认安装在/usr/local/Trolltech/Qt-4.5.3下.编译完成后源程序不要删除,还有用。
将
qt-embedded-linux-opensource-src-4.5.3.tar.bz2
解压得到
qt-embedded-linux-opensource-src-4.5.3,
重命名为
qt-embedded-linux-opensource-src-4.5.3-x86.
再次解压qt-embedded-linux-opensource-src-4.5.3.tar.bz2,
并重命令为qt-embedded-linux-opensource-src-4.5.3-arm.
为什么有两个复制呢?我们可以从他们的名字上就不难看出前者是适合x86架构的,后者适合arm架构的。
如果有开发板的话,可以只编译qt-embedded版本成arm架构的就可以了,但是很多时候用qvfb的话,开发会方便很多,所以多编译一个x86架构的也不错。
具体步骤如下:
tar xjvfqt-embedded-linux-opensource-src-4.5.3.tar.bz2
mv qt-embedded-linux-opensource-src-4.5.3qt-embedded-linux-opensource-src-4.5.3-x86
tar xjvf qt-embedded-linux-opensource-src-4.5.3.tar.bz2
mv qt-embedded-linux-opensource-src-4.5.3qt-embedded-linux-opensource-src-4.5.3-arm
cdqt-embedded-linux-opensource-src-4.5.3-x86
./configure -prefix/usr/local/Trolltech/QtEmbedded-4.5.3-x86 -embedded x86 -qvfb (4分钟)
make (1.5小时)(8:45~10:15)
make install
qt-embedded-x86被安装在/usr/local/Trolltech/QtEmbedded-4.5.3-x86下.
注意这些命令都是什么意思,尤其是最后的两个-I/usr/local/tslib/include-L/usr/local/tslib/lib,是对应相应的tslib的安装路径,-prefix /usr/local/Trolltech/QtEmbedded-4.5.3-arm是对应以后我们这个程序的安装路径
cdqt-embedded-linux-opensource-src-4.5.3-arm
./configure -prefix/usr/local/Trolltech/QtEmbedded-4.5.3-arm -release -shared -little-endian-no-qt3support -no-libtiff -no-libmng -qt-libjpeg -qt-gif -qt-zlib -qt-libpng-no-freetype -no-openssl -nomake examples -nomake demos -nomake tools-optimized-qmake -no-phonon -no-nis -no-opengl -no-cups -no-separate-debug-info-xplatform qws/linux-arm-g++ -embedded arm -depths 4,8,16,32 -qt-mouse-tslib-I/usr/local/tslib/include -L/usr/local/tslib/lib
#make
#make install
qt-embedded-arm被安装在/usr/local/Trolltech/QtEmbedded-4.5.3-arm下.
(当然可以写成一个shell脚本。)
做到这一步还有qvfb没有编译,到qt-x11-opensource-src-4.5.3中重新编译qvfb即可
cd qt-x11-opensource-src-4.5.3
cd /tools/qvfb
make
//会在qt-x11-opensource-src-4.5.3/bin下生成qvfb,我们将它copy至/usr/local/Trolltech/QtEmbedded-4.5.3-x86/bin下
cp ../../bin/qvfb/usr/local/Trolltech/QtEmbedded-4.5.3-x86/bin/
这里解释一下上面这些东西都是干什么的。安装的qt-x11-opensource-src-4.5.3版本,顾名思义,就是在x86(电脑)上面可以运行的版本,这个版本中会产生designer可执行程序,和第二大步中安装的IDE中的是designer是一样的。只不过这个版本不会产生creator,所以还要做第二大步。
qt-embedded-linux-opensource-src-4.5.3这个版本编译了两次,分别是x86版本和arm版本。Arm版本是必须的,因为以后要在arm板子上面运行程序,一定要有相应的编译程序。但是,x86版本的程序是可选的,大家可以理解为,这里的x86版本相当于一个模拟器,但是,这个模拟器依赖于qvfb来运行。Qvfb在哪儿呢?是在qt-x11-opensource-src-4.5.3里面,所以还要继续编译。
怎么样,这个体系够复杂吧?这里一定要好好理解,因为我们经常会用到在两个平台之间交互的东西,尤其是底层的相关东西,因为两个系统的平台不一样,会有很大的区别,理解两个体系是嵌入式工程师的一个基本素质。
7.至此我们已经安装好了qt-x11版,即在PC机上运行的QT,qt-embedded-x86版(x86体系的嵌入式板子上运行的QT,在我们这个应用中就是一个模拟器)和qt-embedded-arm(arm板子上运行的QT).下一步:
编辑#gedit setX86env.sh 内容如下:
#! /bin/sh
PATH=/usr/local/Trolltech/Qt-4.5.3/bin:$PATH
LD_LIBRARY_PATH=/usr/local/Trolltech/Qt-4.5.3/lib:$LD_LIBRARY_PATH
QTEDIR=/usr/local/Trolltech/QtEmbedded-4.5.3-x86:$QTEDIR
PATH=/usr/local/Trolltech/QtEmbedded-4.5.3-x86/bin:$PATH
LD_LIBRARY_PATH=/usr/local/Trolltech/QtEmbedded-4.5.3-x86/lib:$LD_LIBRARY_PATH
编辑#gedit setARMenv.sh 内容如下:
#! /bin/sh
PATH=/usr/local/Trolltech/Qt-4.5.3/bin:$PATH
LD_LIBRARY_PATH=/usr/local/Trolltech/Qt-4.5.3/lib:$LD_LIBRARY_PATH
QTEIR=/usr/local/Trolltech/QtEmbedded-4.5.3-arm:$QTDIR
PATH=/usr/local/Trolltech/QtEmbedded-4.5.3-arm/bin:$PATH
LD_LIBRARY_PATH=/usr/local/Trolltech/QtEmbedded-4.5.3-arm/lib:$LD_LIBRARY_PATH
cd /usr/local/Trolltech/QtEmbedded-4.5.3-x86
source setX86env.sh
cd/usr/local/Trolltech/QtEmbedded-4.5.3-x86/demos/books
qvfb -width 640 -height 480 &
./books -qws
如图:
是在原来的root_qtopia文件系统的基础上构建的,前提准备:按照《micro2440用户手册》使用NFS挂载root_qtopia文件系统,随后进行如下操作:注意,下面的操作都是基于mini2440的:
在opt/下新建目录qt4.5.3/和qt4.5.3/plugin; qt4.5.3/bin
将/usr/local/Trolltech/QtEmbedded-4.5.3-arm/lib目录的全部内容(含lib)拷贝到qt4.5.3/下(以后知道哪些不必要的再考虑删除)
注意,这里使用的是我们刚才编译的arm平台下面的库
将/usr/local/Trolltech/QtEmbedded-4.5.3-arm/plugins/imageformats目录的全部内容(含imageformats)拷贝到qt4.5.3/plugin下
将/usr/local/Trolltech/QtEmbedded-4.5.3-arm/demos/mainwindow下的mainwindow拷贝到qt4.5.3/bin下(由于前面的qt4.5.3的arm版的配置中没有配置编译demos故可以自己在x86下的相应目录下编译arm版的mainwindow执行程序。)
编写qt4运行环境变量设置脚本qt4.5.3,放到/bin目录下修改权限为777可执行。
内容如下:
#! /bin/sh
export set TSLIB_TSDEVICE=/dev/input/event0
export setTSLIB_CONFFILE=/usr/local/etc/ts.conf
export setTSLIB_PLUGINDIR=/usr/local/lib/ts
export set TSLIB_CALIBFILE=/etc/pointercal
export set QTDIR=/opt/qt4.5.3
export set QPEDIR=/opt/qt4.5.3
export setQWS_DISPLAY="LinuxFB:/dev/fb0"
export setQWS_DISPLAY="LinuxFB:mmWidth130:mmHeight100:0"
export set QWS_KEYBOARD=TTY:/dev/tty1
export setQWS_MOUSE_PROTO="TSLIB:/dev/input/event0"
export set QT_PLUGIN_PATH=$QTDIR/plugins/
export set QT_QWS_FONTDIR=$QTDIR/lib/fonts/
export set HOME=/root
export set PATH=$QTDIR/bin:$PATH
export setLD_LIBRARY_PATH=$QTDIR/lib:/usr/local/lib:$LD_LIBRARY_PATH
(这里的触摸屏相关设置与qtopia的一致,是因为qtopia使用的就是tslib-1.4.1因此不需拷贝自己编译的tslib相关库和配置文件,但是是必须编译tslib的否则qt4中的tslib是不能用的。)
Vi /etc/init.d/rcS
设置rcS运行qt4应用程序。
在rcS的最下面,注释掉qtopia的运行
#/bin/qtopia &
#echo " " >/dev/tty1
#echo "Starting Qtopia, pleasewaiting..." > /dev/tty1
改为qt4程序的运行
source /bin/qt4.5.3
if [ -f /etc/pointercal ] ; then
$QPEDIR/bin/books -qws
>/dev/null 2>/dev/null
else
/usr/local/bin/ts_calibrate 触摸屏校正程序
$QPEDIR/bin/books-qws
> /dev/null 2>/dev/null
fi
#注意搞明白上面的话都是什么意思
应该和x86上面的差不多。
这里的工程名为hello,建立好工程后,添加新文件。这里添加Qt Designer Form。
我们这里使用默认设置。
在新建好的框口上添加一个标签,并更改文本为hello world。
在工程文件夹上点击右键,弹出的菜单中选择第一项编译工程。
因为还没有写主函数,所以现在编译文件会出现错误,不过没关系,因为我们只是想编译一下ui文件。
点击这个图标,去掉弹出的菜单中第二项前的对勾,显示隐藏的文件。这时你就能看到ui文件对应的头文件了。
而如果去掉菜单中的第一项前的对勾,列表中的文件就会分类显示,如图
ui文件对应的.h文件默认为ui_dialog.h(例如form.ui对应ui_form.h)。
其中是设计器设计的窗口的对应代码。我们这里的.h文件是最简单的,其类名为Ui_Dialog,可以看到其中有我们添加的标签对象。
在这个类里有一个setupUi函数,我们就是利用这个函数来使用设计好的窗口的。
我们添加main.cpp文件,并更改内容如下。
其中ui->setupUi(dd);一句就是将设计的窗口应用到新建的窗口对象上。
这时运行程序,效果如下。
启动Qt-creator。
在Qt-creator菜单栏Tools—〉Options…打开Options窗口。
在Options界面左侧,点击Qt4—〉Qt Versions右侧显示Qt Versions设置界面。
在Qt Versions界面中点击那个蓝色的大“╋”号图标
在下方Version Name:文本框内输入Qt的版本名,可以随便填,能区分各个版本即可(如pc版取Qt4.5.3-pc、x86版取QtE4.5.3-x86、arm版取QtE4.5.3-arm)。
单击Qmake Location:右侧Browse…按钮,在弹出的“Select QMake Executable”窗口中找到对应版本的qmake程序(按照我们前面安转的,pc版路径:/usr/local/Trolltech/Qt-4.5.3/bin/qmake,x86版路径:/usr/local/Trolltech/QtEmbedded-4.5.3/bin/qmake,arm版路径:/usr/local/Trolltech/QtEmbedded-4.5.3-arm/bin/qmake),单击打开,回到QtVersions界面。
回到Qt Versions界面,单击Debugging Helper:右侧Rebuild按钮,等待片刻,看到Debugging Helper:后出现一个绿色的“√”即可。
同理完成其他版本的添加。
添加完毕,单击OK按钮关闭Options窗口。
到此,Qt-creator配置完毕(我暂时就配置了这些)。
从/usr/local/Trolltech/QtEmbedded-4.5.3/demos下复制books例程到root/tmp文件夹下。
启动Qt-creator,File—〉Open File or Project…,打开root/tmp/books/books.pro。
这里我们分两部分,首先编译x86下的,并运行在qvfb下,再编译arm下的,移到开发板下运行。
在Qt-creator界面左侧点击Projects图标,打开工程设置界面。
从上往下,
在Edit Project Settings for Project books——〉BuildSettings——〉Edit Build Configuration:单击Add,在下拉列表中选择UsingQt Version “QtE4.5.3-x86”弹出对话框单击Ok按钮,在Edit Build Configuration:下会出现蓝色的MakeQtE4.6.3-x86 Release active.字符,单击激活QtE4.6.3-x86 Release。
在Run Settings——〉Edit run configuration:右侧单击Show Details按钮,在打开的下拉列表中Arguments:文本框中添加参数“-qws”。
设置完毕,点击Edit图标,回到编辑界面。
编译:在Build菜单下,先Clean Project “books”,然后Build Project “books”,在右下角Compile Output窗口能看到编译信息(按我们上面这样走来,到此编译不会出问题的)。
运行:
启动终端,# /usr/local/Trolltech/QtEmbedded-4.5.3/bin/qvfb -width 800 -height480 &,启动Qvfb。
回到Qt-creator,Build——〉Run,运行程序。
切换我们的Qvfb窗口中,是不是看到Books运行的界面了。
调试:Debug——〉Start Debugging——〉Start Debugging,即可启动调试(请保证books路径中没有中文名,即不要把books工程放在了某个含有中文字符的文件夹下,不然无法启动调试)。
此时感觉如果前面编译选项Edit Project Settings for Project books——〉BuildSettings——〉Edit Build Configuration:选择Debug项,则调试启动速度比Release时的要快很多。
编译:在Projects设置界面下,选择Using Qt Version “QtE4.5.3-arm”项,余下参数不变,build。
复制编译好的文件(也许还有images文件夹)到2440的NFS文件系统的某个目录下,执行./books –qws
运行及错误处理:
在minicom下面,ps一下,找到qpe进程对应的PID,比如1234,然后通过kill 1234杀死Qtopia。当然,也可以通过修改rcS来解决。
进入books目录,执行./books –qws,此时就会出现前面讲到的“relocation error: /usr/local/Trolltech/QtEmbedded-4.5.3-arm/lib/libQtGui.so.4:symbol powf, version GLIBCXX_3.4 not defined in file libstdc++.so.6 with linktime reference”错误。
网上一个人的解决办法:
我的解决办法是进入主机/opt/toolchains/arm920t-eabi/arm-angstrom-linux-gnueabi/lib目录下找到libstdc++.so.6链接的文件libstdc++.so.6.0.8(通过右键属性——〉基本,可以看到链接的文件),复制并重命名为libstdc++.so.6到/opt/FriendlyARM/mini2440/root_qtopia/lib文件夹下,之前别忘了将该文件夹下的libstdc++.so.6移到其它地方或重命名,如libstdc++.so.6.old。
*重命名其实是比较野蛮的方法,可以用ln命令的,参照下面这篇文章……
http://hi.baidu.com/a263238386/blog/item/362f01ce7b11a10a93457eae.html
然后再运行./books –qws,看问题是不是解决了!
Qwt是qt的一个插件,可以用来实现图表的功能。这里简介安装过程如下:
mkdir 00Software
cd 00Software
wget http://downloads.sourceforge.net/project/qwt/qwt/6.0.1/qwt-6.0.1.zip
unzip qwt-6.0.1.zip
rm qwt-6.0.1.zip
cd qwt-6.0.1
qmake
//注意,这里的qmake需要额外注意。刚刚我们编译了很多版本的qt,如果在PC上运行,就需要用PC版本的qmake,arm上运行,就要用arm版本的qmake,如果是qvfb模拟器运行,就要使用模拟器版本的qmake。具体做法:
Arm版本:export PATH=/usr/local/Trolltech/QtEmbedded-4.5.3-arm/bin/:$PPATH,把arm版本的qmake放在环境变量的最前面,这样系统找到这个版本的qmake之后就不会再找别的qmake了。X86的同样道理:
export PATH=/usr/local/Trolltech/QtEmbedded-4.5.3/bin/:$PPATH
注意:两个版本的都需要编译。
sudo make
sudo make install
cd /usr/local/lib
sudo ln -s/usr/local/qwt-6.0.1/lib/libqwt.so.6 libqwt.so.6
sudo ldconfig
//注意最后的ldconfig,是重新载入动态链接库的意思。这样才能够让我们的配置生效。
cd ~/00Software/qwt-6.0.1/examples
qmake
make
cd bin
./sinusplot
会出现一个正弦曲线。这时候说明至少x86版本的成功了。
cd~/00Software/qwt-6.0.1/designer/plugins/designer
sudo cp libqwt_designer_plugin.so/opt/qtcreator-2.3.0/bin/designer/
这一步我没有成功,因为我的qtcreator没有这样的安装目录。因此,我选择了一个变通的方式,将这个插件装在designer下面:
sudo cp libqwt_designer_plugin.so /usr/local/Trolltech/QtEmbedded-4.5.3/plugins/designer/plugin
这样做,在designer下面会看到这个插件,但是creator下面看不到这个插件,这个问题有待解决,不过可以使用了。需要注意的是,这个时候要启动/usr/local/Trolltech/QtEmbedded-4.5.3/bin下面的designer,才能看到这个插件,而在qt creator中是不显示的,算是一个小遗憾。
首先使用qt designer建立一个名为qwt_designer的ui,里面只添加一个qwtPlot,这里和VC差不多。
将这个ui保存为qwt_design.ui,然后打开qt creator,同第四部分一样,建立一个工程,并把现在的ui文件加入。
添加main.cpp文件如下图所示:
将pro文件修改为下图所示:
其中,上面注释掉的是为了产生arm代码而包含的qwt的库;下面的是为了产生PC下面的代码而包含的qwt的库。
选择左侧的project,选择“manage”,添加名为“QT-X11”的版本。该版本对应的是之前qt-x11-opensource-src-4.5.3所编译出来的版本的bin目录。完成之后,点击左下方的绿色三角,编译并运行。
运行结果:
这是在PC上面模拟运行。将.pro文件arm平台下的注释去掉,并且将X86平台下的注释加上:
在project中,选择qt-4.5.3-arm
选择 build – clean all,再rebuild即可生成arm架构下的文件,将其拷贝到NFS文件系统下:
在mini2440下执行./qwt_design –qws即可。
错误处理:
另,移植qwt的时候,如果qt designer的版本过低(4.5),可能就显示不出来qwt的插件(因为我是用ubuntu的software center直接安装的qt,发现版本太低),解决方法很简单,就是安装一个新版本的qt designer 就可以了(我的是4.7.4)
第三,如果想在qtcreator中集成的designer中显示qwt控件,将刚刚那个动态库libqwt_designer_plugin.so拷贝到qt sdk安装目录\QtCreator/lib/qtcreator/plugins/designer下面就可以了