由于做嵌入式开发,很多时候ARM板子没有QT环境,也没有提供对应的交叉编译链,需要自己将QT源码编译,网上也很多教程,这边以全志A33为例,写个制作QT交叉编译教程。
1、首先这边默认你已经安装好Lunux环境,我是用的是虚拟机,安装的是Ubuntu20.4 LTS版本,在QT官网下载好linux版本的qt,qt的下载链接:https://download.qt.io/archive/qt/5.12/5.12.12/
这边下载的是:安装QT这边就省略了,基本就是一路点next,注册账号就行。
2、由于我们要做交叉编译链,所以这边还要下载QT的源码包,下载链接:https://download.qt.io/archive/qt/5.12/5.12.12/single/
3、准备安装arm-xxx-gcc交叉编译器(xxx表示你需要用到的交叉编译器),将编译器解压到ubuntu的"/opt/"文件夹下(编译器放在什么文件夹随意),例如我的解压到:
然后将编译链接配置到环境变量中,有几种方式,1、可以直接
// 对当前终端生效
export PATH="export PATH=/opt/OpenWrt-Toolchain-sunxi_gcc-5.3.0_musl-1.1.16_eabi.Linux-x86_64/toolchain-arm_cortex-a8+vfpv3_gcc-5.3.0_musl-1.1.16_eabi/bin/:$PATH"
追加到环境变量中。
2、直接加到用户环境变量中 用vim 编辑 “~/.bashrc”,在最后追加上刚刚的路径:3、最后验证环境变量是否正常:输入
//
arm-openwrt-linux-gcc -v
1、进入到QT源码包解压后的"/qt-everywhere-src-5.12.12/qtbase/mkspecs/"路径下,新建文件夹
// A code block
cd /home/jank/A33/qt-everywhere-src-5.12.12/qtbase/mkspecs/
sudo mkdir linux-openwrt-g++
然后从同级文件夹里面复制,qmake.conf 和 qplatformdefs.h文件然后修改qmake.conf编译配置文件,这里其实主要是指定你的开发板架构平台和编译工具链。将文件内容替换成以下:
#
# qmake configuration for building with arm-linux-gnueabi-g++
#
MAKEFILE_GENERATOR = UNIX
CONFIG += incremental
QMAKE_INCREMENTAL_STYLE = sublib
QT_QPA_DEFAULT_PLATFORM = linuxfb
QMAKE_CFLAGS_RELEASE += -O2 -march=armv7-a -lts //指定开发板架构
QMAKE_CXXFLAGS_RELEASE += -O2 -march=armv7-a -lts
include(../common/linux.conf)
include(../common/gcc-base-unix.conf)
include(../common/g++-unix.conf)
# modifications to g++.conf
QMAKE_CC = arm-openwrt-linux-gcc //指定编译工具
QMAKE_CXX = arm-openwrt-linux-g++
QMAKE_LINK = arm-openwrt-linux-g++
QMAKE_LINK_SHLIB = arm-openwrt-linux-g++
# modifications to linux.conf
QMAKE_AR = arm-openwrt-linux-ar cqs
QMAKE_OBJCOPY = arm-openwrt-linux-objcopy
QMAKE_NM = arm-openwrt-linux-nm -P
QMAKE_STRIP = arm-openwrt-linux-strip
load(qt_config)
修改完成后,到QT源码解压目录下,新建一个编译配置脚本
cd ~/A33/qt-everywhere-src-5.12.12/
vim compile.sh
然后将下面内容添加到脚本中
#!/bin/bash
./configure -v \
-prefix /home/jank/A33/a33_qt5_linux \ //编译后会保存到这个文件夹
-opensource \
-confirm-license \
-release \
-shared \
-strip \
-xplatform linux-openwrt-g++ \ //linux-openwrt-g++ 是刚刚创建的文件夹,qt会根据里面的工具链和架构编译qt
-c++std c++11 \
--rpath=no \
-pch \
-make libs \
-make examples \
-make tools -nomake tests \
-gui \
-widgets \
-dbus-runtime \
--glib=no \
--iconv=no \
--pcre=qt \
--zlib=qt \
-no-openssl \
--freetype=qt \
--harfbuzz=qt \
-no-opengl \
-linuxfb \
--xcb=no \
--libpng=qt \
--libjpeg=qt \
--sqlite=qt \
-plugin-sql-sqlite \
-tslib \ //触摸屏相关
-I/home/jank/A33/a33_qt5/include/ \ //引入头文件
-L/home/jank/A33/a33_qt5/lib/ //引入库文件
关于脚本内容的解释,可以查看 config里面的注释:也可以查看这篇博文:https://blog.csdn.net/p942005405/article/details/83652502
2、将脚本文件添加可执行权限
chmod 777 compile.sh
然后运行脚本
./compile.sh
如果没错,会出来让你执行make信息,
如果出现报错,一般都是环境配置问题,回去检查环境配置。
1、刚刚如果运行脚本成功,就可以执行make,使用多线程运行,
make -j 12
2、大概一小时后,就会编译完成在运行安装
make install
1、打开QT设置,配置qmake
然后配置 GCC和G++编译链位置
最后配置kits
到这里所有配置都完成了,就可以编写ARM板子的程序了,
1、在ARM板子运行QT程序之前,需要将刚刚在Ubutun编译的ARM版本的QT库拷贝到板子里面,也就是:"/home/jank/A33/a33_qt5_linux/lib"路径下的,然后在ARM中使用 export 的方式将所用到的QT库加入到环境变量中,不然会出现缺少xxx.dll的报错。