用QEMU搭建arm开发环境之六:建立QT交叉编译环境

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-strip

load(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-install

To 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

如果出现下面的界面就说明启动成功.

 

鸣谢:本文部分资料来自下面的链接,感谢相关作者的贡献,如果侵权或需删除请联系我:xiongga@emsym.com

https://doc.qt.io/archives/qt-4.8/qt-embedded-install.html

https://wiki.qt.io/DirectFBAndQt

https://doc.qt.io/archives/qt-4.8/qt-embeddedlinux-directfb.html

https://blog.csdn.net/xyk_code/article/details/19155033

https://blog.csdn.net/qq_34684524/article/details/104999306

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值