完整的交叉编译好支持xcb的qt库(qt5.15.2、arm64、xcb、no-opengl)
已安装xcb、X11库的交叉编译器(x86_64-aarch64-linux-gnu)
文章目录
1. 修改qmake.conf,指定交叉编译器
Qt教程3-Ubuntu(x86_64)上配置arm64(aarch64)交叉编译环境及QT编译arm64架构工程
在/home/alexios/Qt/5.15.2
目录下,有以下内容:
——sha1s.txt:包含文件或版本校验值的文本文件,方便验证文件完整性。
——Src:Qt 源代码所在的文件夹,用于自定义编译或查看代码。
——gcc_64:用于 64 位 GCC 编译器的 Qt 构建版本。
——wasm_32:Qt WebAssembly 的 32 位构建版本,用于将应用程序部署在 Web 浏览器中。
在/home/alexios/Qt/5.15.2/Src/qtbase/mkspecs/linux-aarch64-gnu-g++
编辑qmake.conf
配置文件
# qmake configuration for building with aarch64-linux-gnu-g++
# 用于使用 aarch64-linux-gnu-g++ 工具链构建 Qt 的 qmake 配置文件
MAKEFILE_GENERATOR = UNIX # 指定 qmake 生成 Makefile 的类型,UNIX 表示为类 Unix 系统
CONFIG += incremental # 启用增量构建,提升编译效率
QMAKE_INCREMENTAL_STYLE = sublib # 设置增量构建的样式为子库模式(sublib)
# 包含公共配置文件,减少重复定义
include(../common/linux.conf) # 包含特定于 Linux 平台的通用配置
include(../common/gcc-base-unix.conf) # 包含 GCC 编译器的通用配置
include(../common/g++-unix.conf) # 包含 G++ 编译器的通用配置
# 针对 aarch64-linux-gnu-g++ 的工具链配置
QMAKE_CC = aarch64-linux-gnu-gcc # 设置 C 编译器
QMAKE_CXX = aarch64-linux-gnu-g++ # 设置 C++ 编译器
QMAKE_LINK = aarch64-linux-gnu-g++ # 设置静态链接器
QMAKE_LINK_SHLIB = aarch64-linux-gnu-g++ # 设置动态链接器
# 针对其他工具的配置
QMAKE_AR = aarch64-linux-gnu-ar cqs # 设置归档工具,用于创建静态库;cqs 表示创建时保持静默
QMAKE_OBJCOPY = aarch64-linux-gnu-objcopy # 设置对象文件复制与修改工具
QMAKE_NM = aarch64-linux-gnu-nm -P # 设置符号表工具,-P 参数显示原始符号表
QMAKE_STRIP = aarch64-linux-gnu-strip # 设置剥离工具,用于删除对象文件中的调试信息
# 加载 Qt 配置,用于包含额外的 Qt 构建规则和模块依赖
load(qt_config)
根据自己交叉编译器的名称修改,本机的交叉编译器已在/etc/profile
添加了环境变量,且本机只有一个交叉编译器,故只需修改名称。所使用的交叉编译器是在arm官网下载的,gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu
,名称中间需添加无厂家-none-
# modifications to g++.conf
QMAKE_CC = aarch64-none-linux-gnu-gcc
QMAKE_CXX = aarch64-none-linux-gnu-g++
QMAKE_LINK = aarch64-none-linux-gnu-g++
QMAKE_LINK_SHLIB = aarch64-none-linux-gnu-g++
# modifications to linux.conf
QMAKE_AR = aarch64-none-linux-gnu-ar cqs
QMAKE_OBJCOPY = aarch64-none-linux-gnu-objcopy
QMAKE_NM = aarch64-none-linux-gnu-nm -P
QMAKE_STRIP = aarch64-none-linux-gnu-strip
load(qt_config)
校验交叉编译器的环境变量是否加载成功,显示版本号即为安装成功
~$ aarch64-none-linux-gnu-g++ -v
...
gcc 版本 10.2.1 20201103 (GNU Toolchain for the A-profile Architecture 10.2-2020.11 (arm-10.16))
2. 配置编译选项,执行configure
/home/alexios/Qt/5.15.2/Src/configure
该脚本 configure
是 Qt 源代码编译环境的入口,用于配置 Qt 构建参数,确保必要的环境和依赖正确设置。以下是逐行解释和相关注释:
#! /bin/sh
# 指定使用 /bin/sh 作为脚本解释器
License Header
#############################################################################
## ...
## License header (省略)
#############################################################################
这部分是版权声明和许可证信息,明确了脚本使用的许可协议(商业许可或 GPLv3)。
获取脚本所在目录并定位 configure
srcpath=`dirname $0`
# 获取脚本所在目录的相对路径
srcpath=`(cd "$srcpath"; pwd)`
# 将相对路径转换为绝对路径,确保脚本运行时无论从哪里调用都能正确找到资源
configure=$srcpath/qtbase/configure
# 设置目标配置工具的路径,位于源码目录的 `qtbase/configure`
if [ ! -e "$configure" ]; then
echo "$configure not found. Did you forget to run \"init-repository\"?" >&2
exit 1
fi
# 检查目标配置文件是否存在,如果没有找到,提醒用户是否忘记运行初始化命令 `init-repository`
创建 qtbase
目录并进入
mkdir -p qtbase || exit
# 确保 `qtbase` 目录存在,如果无法创建则退出脚本
echo "+ cd qtbase"
cd qtbase || exit
# 进入 `qtbase` 目录,失败则退出
执行配置命令
echo "+ $configure -top-level $@"
# 显示将要执行的命令,方便用户调试
exec "$configure" -top-level "$@"
# 执行 `qtbase/configure`,并传递所有脚本参数(`$@`)
# `-top-level` 参数用于指示配置为顶层构建
使用方法
在Qt下新建build文件夹,存放构建文件;新建Qt5.15.2-arm64,存放编译好的库文件。
进入build文件夹,在命令行中运行该脚本时,可以通过附加参数控制 Qt 的构建选项。例如:
./../5.15.2/Src/configure -prefix /home/alexios/Qt/Qt5.15.2-arm64 -make libs -xplatform linux-aarch64-gnu-g++ -skip qtdeclarative -no-opengl -force-debug-info -mp
-prefix
:指定安装路径。-make libs
:只编译库文件,不包含示例、测试或工具。-platform linux-aarch64-gnu-g++
: 指定目标平台为 aarch64,并使用 GNU 工具链,位于/home/alexios/Qt/5.15.2/Src/qtbase/mkspecs
下,已在前面修改过qmake.conf
,指定自定义的交叉编译器。-skip qtdeclarative
:跳过qtdeclarative
模块的构建,减少编译时间或避免某些依赖。-no-opengl
:禁用OpenGL。-static
生成静态库.a文件-shared
生成动态库so文件(参数可选,默认是shared)-force-debug-info
:强制生成调试信息(参数可选)这个参数是让Qt release版本生成.pdb文件,若在release版本下设置了异常捕获信息函数,则打印出错堆栈信息必须要有.pdb文件。如果程序没用开启异常捕获选项,是不需要开启这个参数的。-mp
:启动多核编译。
3. 不直接运行命令,可创建脚本执行
步骤2是执行configure生成Makefile,但命令比较长,我们可以创建一个脚本文件,执行该脚本生成Makefile。在build目录下新建autoconfigure.sh
脚本。
#!/bin/bash
./../5.15.2/Src/configure -prefix /home/alexios/Qt/Qt5.15.2-arm64 \ # 指定安装路径
# -static \ # 静态链接模式,Qt 库将被编译成静态库,而不是动态库(.so)
# -release \ # 构建发布版本,生成优化后的版本,适合生产环境
-opensource \ # 使用开源许可证,适合非商业项目的开发和分发,通常采用 GPL 或 LGPL
-make libs \ # 只构建 Qt 核心库(libs),不包括其他工具、示例和测试程序
-xplatform linux-aarch64-gnu-g++ \ # 指定交叉编译平台,目标平台为 ARM64 架构,使用 GNU 工具链
# -optimized-qmake \ # 优化后的 qmake 工具,提升构建效率
# -pch \ # 预编译头文件(PCH)功能,减少编译时间,尤其是包含大型头文件时
# -qt-zlib \