环境
WSL (ubuntu22.04) 没有安装请搜索安装教程
qt 5.12.0 源代码压缩包
下载链接: https://download.qt.io/archive/qt/5.12/5.12.0/single/
选择 tar.xz结尾的压缩文件,
组件准备
***本教程默认使用root权限进行操作,因为编译qt源码后执行make时需要root 用户权限
且本教程所编译的qt源码不含OpenGL组件***
编译工具链
根据个人需求下载对应的交叉编译工具链
本文章使用arm-none-linux-gnueabi-gcc 编译工具链
首先更新软件仓库
apt update
apt upgrade
安装一个合适自己的编辑工具
这里我使用vim,因为会对部分qt源代码进行修改
apt install vim
下载交叉编译工具链
这里我使用arm-none-linux-gnueabi-gcc
下载编译工具链 ( gcc-arm-11.2-2022.02-x86_64-arm-none-linux-gnueabihf.tar.xz)
URL: https://armkeil.blob.core.windows.net/developer/Files/downloads/gnu/11.2-2022.02/binrel/gcc-arm-11.2-2022.02-x86_64-arm-none-linux-gnueabihf.tar.xz
解压目录并且设置环境变量
mkdir /usr/arm_none_linux && tar -vxf gcc-arm-11.2-2022.02-x86_64-arm-none-linux-gnueabihf.tar -C /usr/arm_none_linux/
根据需求设置环境变量
vim ~/.bashrc #root下在这个目录里设置环境变量 会永久存在
#在此文件末尾添加
export PATH=$PATH:/usr/arm_none_linux/XXXXX/bin #XXXX参考自己的/usr/arm_none_linux 路径
更新环境变量
source ~/.bashrc
检测是否成功安装
arm-none-linux-gnueabihf-g++ -v #C++交叉编译工具链
arm-none-linux-gnueabihf-gcc -v #C交叉编译工具链
也可以查看其余的交叉编译工具
语法遵循上述规律 在后面加选项 -v 即可
下载CMake && make
通过命令行下载CMake
apt install cmake
安装qt支持
由于qt是一个由各种组件组成的框架,所以我们可以有选择性的安装每一个支持包,
安装qt基础支持包
sudo apt-get install build-essential perl python3 git
安装qt的xcb组件包
sudo apt-get install '^libxcb.*-dev' libx11-xcb-dev libglu1-mesa-dev libxrender-dev libxi-dev libxkbcommon-dev libxkbcommon-x11-dev
安装qt的webKit组件包
sudo apt-get install flex bison gperf libicu-dev libxslt-dev ruby
安装qt WebEngine组件
sudo apt-get install libxcursor-dev libxcomposite-dev libxdamage-dev libxrandr-dev libxtst-dev libxss-dev libdbus-1-dev libevent-dev libfontconfig1-dev libcap-dev libpulse-dev libudev-dev libpci-dev libnss3-dev libasound2-dev libegl1-mesa-dev gperf bison nodejs
安装 qt Multimedia组件
sudo apt-get install libasound2-dev libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libgstreamer-plugins-good1.0-dev libgstreamer-plugins-bad1.0-dev
映射已安装的python
sudo ln -s /usr/bin/python3 /usr/bin/python
交叉编译openssl
去官方下载压缩包
https://www.openssl.org/source/old/1.1.1/index.html
解压缩后产生以下文件:
在这个目录下执行以下命令
注意最后的 arm-none-linux-gnueabihf- 这是前面安装的交叉编译工具 ,但是要把最后的g++删掉(注意不要删横杠)
./config no-asm shared no-async --prefix=/opt/oppenssl --cross-compile-prefix=arm-none-linux-gnueabihf-
打开生成的Makefile
第8行
修改PLATFROM=arm
删除第126 和 127行的 -m64
执行 make -j4 && make install 等待安装完成
安装qt5.12.0
将我们下载的qt源码 复制到自己的家目录下,不要放在root根目录下
解压qt源码压缩包
tar -xf qt-everywhere-src-5.12.0.tar.xz
构建编译QT
首先对qt的部分源码进行修改,否则在ubuntu22.04下会存在找不到limits.h头文件的问题
向以下文件中添加
#include <stdexcept>
#include <limits>
-----文件--路径-----
qtbase/src/corelib/global/qendian.h
qtbase/src/corelib/tools/qbytearraymatcher.h
qtdeclarative/src/qmldebug/qqmlprofilerevent_p.h
向下列文件中添加
#include<stdint.h>
-----文件--路径-------
qtlocation/src/3rdparty/mapbox-gl-native/src/mbgl/util/convert.cpp
在下面这个文件中添加头文件时,需要注意添加位置:
在 qtbase/src/corelib/global/qglobal.h的__cplusplus中添加#include <limits>
在qtbase/src/corelib/global/qrandom.cpp 的第220 行添加typedef quint32 result_type;
修改交叉编译工具链路径
使用编辑工具修改以下路径的配置文件
vim $HOME/XXXXX/qtbase/mkspecs/linux-arm-gnueabi-g++/qmake.conf # XXXXX是解压后的qt目录
修改内容:
#
# qmake configuration for building with arm-linux-gnueabi-g++
#
MAKEFILE_GENERATOR = UNIX
CONFIG += incremental
QMAKE_INCREMENTAL_STYLE = sublib
include(../common/linux.conf)
include(../common/gcc-base-unix.conf)
include(../common/g++-unix.conf)
##########在这里添加新的选项
QT_QPA_DEFAULT_PLATFORM = linux
QMAKE_CFLAGS += -O2 -march=armv7-a #设置C语言目标环境为armv7-a 平台
QMAKE_CXXFLAGS += -O2 -march=armv7-a #设置c++语言目标环境为armv7-a 平台
#####################################################
##########################这里的arm-linux-gnueabi-gcc
#### 和arm-linux-gnueabi-g++
# 需要替换为自己的交叉编译工具(这里使用之前下载好的arm-none-linux-gnueabi-gcc工具)
# modifications to g++.conf
QMAKE_CC = arm-none-linux-gnueabihf-gcc
QMAKE_CXX = arm-none-linux-gnueabihf-g++
QMAKE_LINK = arm-none-linux-gnueabihf-g++
QMAKE_LINK_SHLIB = arm-none-linux-gnueabihf-g++
#这里也要同步替换为自己的交叉编译工具配置,
#在本文的环境中,这些配置位置在/usr/bin下
#
# modifications to linux.conf
QMAKE_AR = arm-none-linux-gnueabihf-ar cqs
QMAKE_OBJCOPY = arm-none-linux-gnueabihf-objcopy
QMAKE_NM = arm-none-linux-gnueabihf-nm -P
QMAKE_STRIP = arm-none-linux-gnueabihf-strip
load(qt_config)
这是已经配置好的配置文件
开始构建
为了避免make后的文件污染源码文件,需要新建一个build文件夹
mkdir build && cd build
执行qt自带的.configure 脚本,本文只介绍部分参数,关于该脚本的具体参数请查阅qt官方文档
release -> 构建发布版程序
-opensouce 开源
confirm-license 同意开源许可
-xplatform : 编译哪个平台的qt 对应qtbase/mkspecs/目录下的文件名
-prefix XXXX : 输出目录路径 (默认路径 /usr/local)
-no-opengl: 不构建 opengl组件
-openssl -I : openssl库的头文件路径
-openssl -L : openssl库的链接库文件路径
QT_INSTALL_DIR 为解压后的qt源码目录
执行以下命令
root@tfy:/home/tfy/build $ : ../qt-everywhere-src-5.12.0/configure -prefix /usr/arm_qt -release -opensource -confirm-license -xplatform linux-arm-gnueabi-g++ -no-opengl -no-iconv -silent -qpa linuxfb -no-gtk -qt-libjpeg -qt-libpng -openssl-linked -I/opt/oppenssl/include -L/opt/oppenssl/lib
等待执行完毕后,build目录会出现已经生成好的makefile:
执行 make -j40 && make install 进行最终构建
设置qmake 路径
vim ~/.bashrc
在文件最后一行添加
export PATH=$PATH:/usr/arm_qt/bin #这里填自己的qmake路径
修改完成后执行更新
source ~/.bashrc
查看qmake版本
qmake -v
使用qmake 对qt项目进行交叉编译
在windows上 使用qtcreator 创建的项目中默认会有一个.pro文件
将他们全部复制到wsl里并且切换到该目录下
执行 qmake
qmake #什么参数都不用加, qmake会自动搜索.pro文件
执行完之后会产生Makefile文件
调用 make 交叉编译出最终文件
检查文件数据
使用file命令进行检查文件基本信息
使用readelf -d XXXX 查看文件所需要的所有依赖库