Qemu仿真----(2)构建QT运行环境
平台:ubuntu 16.04
对象:Qemu仿真ARM32.
文件:qt-everywhere-opensource-src-4.8.7.tar.gz
注:本文在《Qemu仿真----(1)挂在网络文件系统》一章的基础上进行修改,请先阅读此篇。
1.下载QT
[https://download.qt.io/archive/qt/4.8/4.8.7/]
下载qt-everywhere-opensource-src-4.8.7.tar.gz
2.编译QT
$ tar -xvf qt-everywhere-opensource-src-4.8.7.tar.gz $ cd qt-everywhere-opensource-src-4.8.7/
2.1 修改交叉编译工具
qt-everywhere-opensource-src-4.8.7/mkspecs/qws/linux-arm-gnueabi-g++/qmake.conf
在《Qemu仿真----(1)挂在网络文件系统》一章中,我们安装的是arm-linux-gnueabi-xxx,所以做如下修改:
@@ -8,14 +8,14 @@ include(../../common/g++-unix.conf) include(../../common/qws.conf) # modifications to g++.conf -QMAKE_CC = arm-none-linux-gnueabi-gcc -QMAKE_CXX = arm-none-linux-gnueabi-g++ -QMAKE_LINK = arm-none-linux-gnueabi-g++ -QMAKE_LINK_SHLIB = arm-none-linux-gnueabi-g++ +QMAKE_CC = arm-linux-gnueabi-gcc +QMAKE_CXX = arm-linux-gnueabi-g++ +QMAKE_LINK = arm-linux-gnueabi-g++ +QMAKE_LINK_SHLIB = arm-linux-gnueabi-g++ # modifications to linux.conf -QMAKE_AR = arm-none-linux-gnueabi-ar cqs -QMAKE_OBJCOPY = arm-none-linux-gnueabi-objcopy -QMAKE_STRIP = arm-none-linux-gnueabi-strip +QMAKE_AR = arm-linux-gnueabi-ar cqs +QMAKE_OBJCOPY = arm-linux-gnueabi-objcopy +QMAKE_STRIP = arm-linux-gnueabi-strip load(qt_config)
2.2 配置QT源码
$ cd qt-everywhere-opensource-src-4.8.7/ ./configure \ -prefix /usr/local/qt-4.8.7-install \ -opensource \ -confirm-license \ -embedded arm \ -host-little-endian \ -no-cups \ -no-3dnow \ -nomake examples \ -nomake demos \ -nomake docs \ -xplatform /qws/linux-arm-gnueabi-g++ \ -little-endian \ -no-webkit
2.3 编译与安装QT
$ make -j4 $ sudo make install
2.4 修改环境变量
$ export ARMQTDIR=/usr/local/qt-4.8.7-install $ export PATH=$ARMQTDIR/bin:$PATH $ export MANPATH=$ARMQTDIR/man:$MANPATH $ export LD_LIBRARY_PATH=$ARMQTDIR/lib:$LD_LIBRARY_PATH $ export QMAKESPEC=/usr/local/qt-4.8.7-install/mkspecs/linux-arm-gnueabi-g++
2.5 验证
$ qmake --version
如果出现版本信息,说明QT安装成功。
3.编写测试代码
$ mkdir qt_demo $ mkdir -p qt_demo/hello $ mkdir -p qt_demo/hellogui
3.1 无GUI版本
$ cd qt_demo/hello $ vim hello_nogui.cpp
添加如下内容:
1 #include <QApplication> 2 #include <QDebug> 3 4 int main(int argc, char *argv[]) 5 { 6 qDebug("Hello world by qt demo."); 7 8 return 0; 9 }
编译:
# 生成hello.pro, hello为目录名 $ qmake -project hello_nogui.cpp # 生成Makefile $ qmake hello.pro # 生成可执行文件 $ make
3.2 GUI版本
$ cd qt_demo/hellogui $ vim hello_gui.cpp
添加如下内容:
1 #include <iostream> 2 #include <QApplication> 3 #include <QWidget> 4 #include <QPushButton> 5 #include <QPoint> 6 #include <QDebug> 7 8 9 int main(int argc, char *argv[]) 10 { 11 QApplication app(argc, argv); 12 QWidget widget; 13 QPushButton button; 14 widget.move(200, 100); 15 widget.resize(300, 400); 16 17 button.setParent(&widget); 18 button.move(100, 100); 19 button.setText("hello"); 20 button.resize(50, 20); 21 widget.show(); 22 qDebug() << "button pos:" << button.pos() << " " << button.size() << endl; 23 24 return app.exec(); 25 }
编译:
# 生成hellogui.pro, hellogui为目录名 $ qmake -project hello_gui.cpp # 生成Makefile $ qmake hellogui.pro # 生成可执行文件 $ make
4.QT移植
在《Qemu仿真----(1)挂在网络文件系统》一章的nfs文件系统"filesystem"的基础上进行。
$ sudo mkdir -p filesystem/usr/local/qt-4.8.7-install/lib $ sudo cp -rf /usr/local/qt-4.8.7-install/lib/* filesystem/usr/local/qt-4.8.7-install/lib/ $ sudo cp qt_demo/hello/hello filesystem/home/ $ sudo cp qt_demo/hellogui/hellogui filesystem/home/
5.运行测试
5.1 编写脚本
$ touch qtboot.sh $ chmod a+x qtboot.sh
添加如下内容:
1 #!/bin/sh 2 3 qemu-system-arm \ 4 -M vexpress-a9 \ 5 -kernel u-boot-2017.05/u-boot \ 6 -m 512M \ 7 -net nic,vlan=0 -net tap,vlan=0,ifname=tap0 \ 8 -append "console=tty0" \ 9 -serial stdio
运行脚本即可启动一个Linux系统。
5.2 测试
进入Qemu仿真的系统后:
$ cd home/
$ ./hello
正常情况下会输出:
Hello world by qt demo.
$ cd home/
$ ./hellogui -qws
正常情况下会显示一个带有hello button的窗体。