Qemu仿真----(2)构建QT运行环境

发布时间 2023-03-28 00:59:24作者: this毛豆

平台: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的窗体。