Qemu - 构建QT运行环境
- 平台:ubuntu 16.04
- 对象:Qemu仿真ARM32.
- 文件:qt-everywhere-opensource-src-4.8.7.tar.gz
注:本文在《挂在网络文件系统》一章的基础上进行修改,请先阅读此篇。
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
在《挂在网络文件系统》一章中,我们安装的是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
添加如下内容:
#include <QApplication>
#include <QDebug>
int main(int argc, char *argv[])
{
qDebug("Hello world by qt demo.");
return 0;
}
编译:
# 生成hello.pro, hello为目录名
$ qmake -project hello_nogui.cpp
# 生成Makefile
$ qmake hello.pro
# 生成可执行文件
$ make
3.2 GUI版本
$ cd qt_demo/hellogui
$ vim hello_gui.cpp
添加如下内容:
#include <iostream>
#include <QApplication>
#include <QWidget>
#include <QPushButton>
#include <QPoint>
#include <QDebug>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QWidget widget;
QPushButton button;
widget.move(200, 100);
widget.resize(300, 400);
button.setParent(&widget);
button.move(100, 100);
button.setText("hello");
button.resize(50, 20);
widget.show();
qDebug() << "button pos:" << button.pos() << " " << button.size() << endl;
return app.exec();
}
编译:
# 生成hellogui.pro, hellogui为目录名
$ qmake -project hello_gui.cpp
# 生成Makefile
$ qmake hellogui.pro
# 生成可执行文件
$ make
4.QT移植
在《挂载网络文件系统》一章的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
添加如下内容:
#!/bin/sh
qemu-system-arm \
-M vexpress-a9 \
-kernel u-boot-2017.05/u-boot \
-m 512M \
-net nic,vlan=0 -net tap,vlan=0,ifname=tap0 \
-append "console=tty0" \
-serial stdio
运行脚本即可启动一个Linux系统。
5.2 测试
进入Qemu仿真的系统后:
$ cd home/
$ ./hello
正常情况下会输出:
Hello world by qt demo.
$ cd home/
$ ./hellogui -qws
正常情况下会显示一个带有hello button的窗体。