1.下载并编译QT4
官方下载地址:https://download.qt.io/archive/qt/4.8/4.8.7/
如果官方下载慢可以从这里下载:
链接:https://pan.baidu.com/s/1SOsVu6--3ujsS9u9l9UIHA
提取码:83dw
QT的编译也需要交叉编译环境,但是我们之前编译内核的时候已经建立的交叉编译环境就可以用.
解压缩上面下载的原程序包,然后编译:
tar xvf qt-everywhere-opensource-src-4.8.7.tar.gz
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
上面命令中参数-prefix /usr/local/qt-4.8.7-install是指定编译后安装文件到/usr/local/qt-4.8.7-install,参数-opensource选择开源方式,参数-confirm-license自动确认授权,参数 -embedded按照嵌入式设备模式编译,参数-xplatform指定编译目标平台的编译器配置文件(下面详细解释),其他参数大部分是设定不编译哪些不必要的模块.
由于这套源代码是给所有平台编译qt环境的,所以需要配置编译的目标平台是什么,编译的时候使用什么交叉编译器.这些配置都放在mkspecs/目录下,比如我们指定的是mkspecs/qws/linux-arm-gnueabi-g++目录,那么在这个目录下面有两个文件.qmake.conf和qplatformdefs.h,和交叉编译相关的主要是第一个文件.内容如下:
#
# qmake configuration for building with arm-none-linux-gnueabi-g++
#include(../../common/linux.conf)
include(../../common/gcc-base-unix.conf)
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++# 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-stripload(qt_config)
我们使用之前编译内核的时候安装的gcc-4.6-arm-linux-gnueabi,该编译器所有命令前缀都是arm-none-linux-gnueabi-,所以直接使用这个文件就行.如果你的编译器和我不一样,你可以修改上述文件,把arm-none-linux-gnueabi-替换为你的编译器前缀即可.
另外,如果你之前定义过QMAKESPEC环境变量,可能会影响编译的结果.请首先清除环境变量QMAKESPEC
export QMAKESPEC=""
编译成功会出现类似下面的提示:
Qt is now configured for building. Just run 'make'.
Once everything is built, you must run 'make install'.
Qt will be installed into /usr/local/qt-4.8.7-installTo reconfigure, run 'make confclean' and 'configure'.
这时候依次运行下面的命令就分别编译(make)和安装(make install)qt-4.8.7开发环境了
make
sudo make install
安装成功后,可以使用qmake --version命令来检查是否安装成功.正常情况下,你会看到类似下面的内容:
QMake version 2.01a
Using Qt version 4.8.7 in /usr/local/qt-4.8.7-install/lib
如果找不到qmake可能是环境变量没有配置:
export QMAKESPEC=/usr/local/qt-4.8.6-install/mkspecs/linux-arm-gnueabi-g++
如果你有多个qt版本,可以使用如下命令来切换你刚才安装的qt-4.8.7为默认版本
qtchooser -install -f default /usr/local/qt-4.8.7-install/bin/qmake
2.编写第一个QT程序QTQEMU
qt编译环境建立成功后,我们分别编译最简单的qt程序,第一个是不带GUI界面的,第二个是带GUI界面的.
编写第一个不带GUI界面的QT程序
mkdir src
cd src
mkdir hello
cd hello
vi hello1.cpp
然后输入如下内容:
#include <QApplication>
#include <QDebug>
int main(int argc,char *argv[])
{
qDebug("Hello, welcome to Qt world!");
return 0;
}
保存退出后输入如下命令编译:
qmake -project hello1.cpp
qmake hello.pro
make
编译成功后你会看到在src/hello目录下出现一个hello的文件,如果你使用命令file hello可以看到类似如下的信息;
$ file hello
hello: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.3, for GNU/Linux 3.2.0, BuildID[sha1]=a514cc28eca331ebb67b4e3f063a4adee300e38c, not stripped
上述信息是说明hello这个文件是一个32为的可执行文件,架构是ARM,使用的指令集是EABI5 version 1
编写第一个带GUI界面的QT程序
参照上面在src目录下建立于一个qtui目录,然后建立一个main.cpp,这个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();
}
然后执行下面的命令编译:
qmake -project main.cpp
qmake qtui.pro
make
编译成功后,会在src/qtui目录下出现一个qtui的文件.
3.在BusyBox文件系统下增加QT运行环境
QT程序编译好后我们需要到QEMU上去执行,在这之前,我们首先要在之前编译好的BusyBox文件系统基础上增加QT的运行环境.就是说吧刚才安装在HOST端的文件复制到嵌入式文件系统中(实际上bin目录下面的文件是可以不复制的,这部分文件只能在HOST运行)
sudo mount rootfsqt4.7.ext3 mnt
cd mnt
cd usr/local
cp -rf /usr/local/qt-4.8.6-install .
cd ../..
然后我们将刚才编译文件复制到文件系统
mkdir home
cd home
mkdir root
cd root
cp ~/src/hello/hello .
cp ~/src/qtui/qtui .
所有文件复制完成后,我们解除挂载,准备运行QEMU
cd ../../..
sudo umount mnt
4.运行QTQEMU
现在启动QEMU来看下我们刚才编译和部署的结果.
qemu-system-arm -M vexpress-a9 -m 1024M -kernel zImage -dtb vexpress-v2p-ca9.dtb -append "root=/dev/mmcblk0 rw console=ttyAMA0" -sd rootfsqt4.7.ext3 -smp 4 -serial stdio
QEMU运行起来后,我们先试下不带GUI的QT是否工作正常.如果出现如下信息说明运行成功:
Please press Enter to activate this console.
/ # cd home/root
/home/root # ls
qthello qtui test test.c
/home/root # ./qthello
Hello, welcome to Qt world!
/home/root #
如果不成功请检查之前复制文件或者编译程序是否正确.
下面我们来试下带GUI的QT.输入如下命令:其中-qws是设置qt运行的窗体系统的.
./qtui -qws
如果出现下面的界面就说明启动成功.