QT交叉编译环境配置
- 1 配置交叉编译工具链
- 1.1 解压 放到`/opt`中
- 1.2 使用环境变量
- 1.2.1 设置成永久的环境变量
- 1.2.2 临时环境变量
- 1.3 安装编译需要的软件
- 2 编译tslib库(如果不需要触摸屏直接跳过)
- 3. 编译qt
- 3.1 编译源码
- 3.2 设置QCreator
- 4 说明
- 4.1 关于编译器名字的区别
- 4.2 如果 mkspecs 目录中没有你用的编译器怎么办?
- 4.3 QT各个模块的作用
如果遇到疑问,看看第4章 说明
中有没有能解决你疑惑的答案
1 配置交叉编译工具链
我使用的是gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu
https://releases.linaro.org/components/toolchain/binaries/7.5-2019.12/aarch64-linux-gnu/
1.1 解压 放到/opt
中
sudo tar -xf gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar -C /opt
1.2 使用环境变量
export TOOLCHAIN_DIR=/opt/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu
export SYSROOT=${TOOLCHAIN_DIR}/aarch64-linux-gnu/libc
export PATH=${TOOLCHAIN_DIR}/bin:$PATHexport CC=${TOOLCHAIN_DIR}/bin/aarch64-linux-gnu-gcc
export CXX=${TOOLCHAIN_DIR}/bin/aarch64-linux-gnu-g++
export AR=${TOOLCHAIN_DIR}/bin/aarch64-linux-gnu-ar
export LD=${TOOLCHAIN_DIR}/bin/aarch64-linux-gnu-ld
export RANLIB=${TOOLCHAIN_DIR}/bin/aarch64-linux-gnu-ranlib
1.2.1 设置成永久的环境变量
sudo vim ~/.bashrc # 打开设置环境变量
#将1.2的内容复制到文件末尾
source ~/.bashrc #使环境变量生效或者#多用户生效
sudo vim /etc/profile
source /etc/profile
1.2.2 临时环境变量
方式一:
打开命令窗口,将1.2内容复制到里面运行
方式二:
创建set_arm_env.sh文件,将下面内容复制进去
#!/bin/bash
export TOOLCHAIN_DIR=/opt/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu
export SYSROOT=${TOOLCHAIN_DIR}/aarch64-linux-gnu/libc
export PATH=${TOOLCHAIN_DIR}/bin:$PATHexport CC=${TOOLCHAIN_DIR}/bin/aarch64-linux-gnu-gcc
export CXX=${TOOLCHAIN_DIR}/bin/aarch64-linux-gnu-g++
export AR=${TOOLCHAIN_DIR}/bin/aarch64-linux-gnu-ar
export LD=${TOOLCHAIN_DIR}/bin/aarch64-linux-gnu-ld
export RANLIB=${TOOLCHAIN_DIR}/bin/aarch64-linux-gnu-ranlib
执行chmod +x set_arm_env.sh
和 source set_arm_env.sh
验证方式:
aarch64-linux-gnu-gcc -v
和
echo “CC=$CC”
1.3 安装编译需要的软件
sudo apt update
sudo apt install perl
sudo apt install python3 #或者python2
sudo apt-get install autoconf automake libtool
2 编译tslib库(如果不需要触摸屏直接跳过)
tslib 是一个用于 触摸屏输入事件校准和处理 的轻量级开源库,常用于 嵌入式 Linux 系统 上的电阻式或电容式触摸屏。
作用:
- 处理触摸屏原始坐标数据
- 进行触摸校准(calibration)
- 消除触摸漂移、误差
- 提供统一的触摸事件接口(/dev/input/eventX)
#下载
git clone https://gitee.com/mqinglang/tslib.git
cd tslib
./autogen.sh
./configure --host=aarch64-linux-gnu ac_cv_func_malloc_0_nonnull=yes --cache-file=aarch64-linux.cache -prefix=/home/mql/qt_src/arm64_linux_gnu/tslib
make -j$(nproc)
make install
3. 编译qt
3.1 编译源码
我使用的是qt5.15.2。你在源码中qt-everywhere-src-5.15.2/qtbase/mkspecs
这个路径下面会看到各个平台的编译配置文件,我用的是arm64-linux-gnu这里面已经包含了这个编译器的编译配置如图:
qmake.conf里面是编译配置:
- 详细解释如下
#这是注释,说明此配置是针对 aarch64-linux-gnu-g++ 交叉编译器的。
# qmake configuration for building with aarch64-linux-gnu-g++
# 指定生成的 Makefile 格式是 Unix 风格。
MAKEFILE_GENERATOR = UNIX
# 这是增量构建的设置,incremental 表示支持增量链接(部分模块重编译);
# sublib 说明增量编译模式按子库为单位。
CONFIG += incremental
QMAKE_INCREMENTAL_STYLE = sublib
# 引入 Qt 提供的通用 Linux + GCC 配置。
# 这些 conf 文件位于 qtbase/mkspecs/common/ 下,封装了 GCC 编译选项和 Linux 系统默认参数。
include(../common/linux.conf)
include(../common/gcc-base-unix.conf)
include(../common/g++-unix.conf)
# 指定交叉编译所使用的编译器为 aarch64-linux-gnu-gcc 和 aarch64-linux-gnu-g++
# modifications to g++.conf
QMAKE_CC = aarch64-linux-gnu-gcc
QMAKE_CXX = aarch64-linux-gnu-g++
QMAKE_LINK = aarch64-linux-gnu-g++
QMAKE_LINK_SHLIB = aarch64-linux-gnu-g++
# 设置归档工具(生成 .a 静态库)等。用于构建时压缩/提取符号:
# modifications to linux.conf
QMAKE_AR = aarch64-linux-gnu-ar cqs
QMAKE_OBJCOPY = aarch64-linux-gnu-objcopy
QMAKE_NM = aarch64-linux-gnu-nm -P
QMAKE_STRIP = aarch64-linux-gnu-strip
- 变量名 含义
QMAKE_CC C 编译器
QMAKE_CXX C++ 编译器
QMAKE_LINK 链接器(C++)
QMAKE_LINK_SHLIB 动态库链接器(C++)
QMAKE_AR 静态库打包工具
QMAKE_OBJCOPY 对目标文件进行复制、符号剥离等操作
QMAKE_NM 显示目标文件符号表
QMAKE_STRIP 剥离调试信息/符号表
# 下载
wget https://mirrors.tuna.tsinghua.edu.cn/qt/official_releases/qt/5.15/5.15.2/single/qt-everywhere-src-5.15.2.tar.xz
# 解压
tar -xf qt-everywhere-src-5.15.2.tar.xz
cd qt-everywhere-src-5.15.2/
创建一个脚本qtsrc.sh,记得将里面的路径修改成你自己对应的,然后加执行权限
#!/bin/bashecho "设置交叉编译工具链环境变量..."
export TOOLCHAIN_DIR=/opt/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu
export SYSROOT=${TOOLCHAIN_DIR}/aarch64-linux-gnu/libc
export PATH=${TOOLCHAIN_DIR}/bin:$PATHexport CC=${TOOLCHAIN_DIR}/bin/aarch64-linux-gnu-gcc
export CXX=${TOOLCHAIN_DIR}/bin/aarch64-linux-gnu-g++
export AR=${TOOLCHAIN_DIR}/bin/aarch64-linux-gnu-ar
export LD=${TOOLCHAIN_DIR}/bin/aarch64-linux-gnu-ld
export RANLIB=${TOOLCHAIN_DIR}/bin/aarch64-linux-gnu-ranlibecho "设置 TSLIB 相关路径..."
export TSLIB_ROOT=/home/mql/qt_src/arm64_linux_gnu/tslib
export PKG_CONFIG_SYSROOT_DIR=$SYSROOT
export PKG_CONFIG_PATH=$TSLIB_ROOT/lib/pkgconfig
export TSLIB_INCLUDE_DIR=$TSLIB_ROOT/include
export TSLIB_LIBRARY_DIR=$TSLIB_ROOT/libecho "开始执行 Qt configure 配置..."
./configure \-prefix /home/mql/qt_src/arm64_linux_gnu/qt5.15.2 \-release \-opensource -confirm-license \-optimized-qmake \-shared \-xplatform linux-aarch64-gnu-g++ \-pch \-c++std c++11 \-linuxfb \-tslib \-qt-zlib \-qt-pcre \-qt-freetype \-qt-harfbuzz \-qt-libpng \-qt-libjpeg \-qt-sqlite \-plugin-sql-sqlite \-gui -widgets -dbus-runtime \-no-openssl \-no-xcb \-no-opengl \-nomake tests \-nomake examples \-recheck-all \-I $TSLIB_INCLUDE_DIR \-L $TSLIB_LIBRARY_DIR \-skip qtnetworkauth \-skip qtwebsockets \-skip qtwebchannel \-skip qtscript \-skip qtwebengine \-skip qtwebview \-skip qtlocation \-skip qtremoteobjects \-skip qtpurchasing \-skip qtactiveqt \-skip qtwinextras \-skip qtx11extras \-skip qtmacextras \-skip qtandroidextras \-skip qtgamepad \-skip qt3d \-skip qtdatavis3d \-skip qtquick3d \-skip qtgraphicaleffects \-skip qtquickcontrols \-skip qtquickcontrols2 \-skip qtquicktimeline \-skip qtlottie \-skip qtsensors \-skip qtspeech \-skip qtdoc \-skip qtwebglpluginecho " configure 配置完成,请检查是否有错误信息。"
echo "接下来可以执行 make -jN 进行编译,例如:make -j$(nproc)"
编译安装
make -j$(nproc)
make install
内容如下
编译参数说明:
# 查看所有参数以及使用方法
./configure -h # 进入到源码根目录(cd qt-everywhere-src-5.15.2),查看模块名字
ls qt*/ | grep -E '^qt'
3.2 设置QCreator
/opt/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-g++
4 说明
4.1 关于编译器名字的区别
以gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu为例:
部分 | 含义 |
---|---|
gcc | GNU 编译器套件(GNU Compiler Collection) |
linaro | Linaro 组织维护的版本,专为 ARM 平台优化 |
7.5.0 | GCC 的主版本号,是 gcc 7 系列,支持 C++11 |
2019.12 | 工具链构建的版本时间(2019年12月发布) |
x86_64 | 构建主机架构(host),即你用这个工具链的机器(通常是 x86_64 架构的 PC) |
aarch64-linux-gnu | 目标架构(target),说明这套工具链是用来生成 aarch64(ARM64)Linux 程序的 |
- aarch64-linux-gnu
是目标系统(Target triple)的三个部分:
部分 | 说明 |
---|---|
aarch64 | 目标 CPU 架构(ARMv8,64 位) |
linux | 目标操作系统 |
gnu | 使用的是 glibc 运行时(不是 uClibc 或 musl) |
你在官网可能开看到了以下诸多编译器名字,又有什么区别:
aarch64-elf
aarch64-linux-gnu
aarch64_be-elf
aarch64_be-linux-gnu
arm-eabi
arm-linux-gnueabi
arm-linux-gnueabihf
armeb-eabi
armeb-linux-gnueabi
armeb-linux-gnueabihf
armv8l-linux-gnueabihf
名称 | 架构 | OS | C库 | 浮点支持 | 字节序 | 用途 |
---|---|---|---|---|---|---|
aarch64-elf | ARM64 | 裸机 | 无 | - | 小端 | 裸机开发、bootloader |
aarch64-linux-gnu | ARM64 | Linux | glibc | 支持 | 小端 | 主流 编译架构 |
aarch64_be-linux-gnu | ARM64 | Linux | glibc | 支持 | 大端 | 非常少见 |
arm-linux-gnueabi | ARM32 | Linux | glibc | soft-float | 小端 | 较老系统,性能差 |
arm-linux-gnueabihf | ARM32 | Linux | glibc | 硬浮点 | 小端 | Raspberry Pi、嵌入式主流 |
arm-eabi | ARM32 | 裸机 | newlib | 无 | 小端 | MCU开发(如 STM32) |
armeb-linux-gnueabihf | ARM32 | Linux | glibc | 硬浮点 | 大端 | 很少用 |
armv8l-linux-gnueabihf | ARMv8 (32位) | Linux | glibc | 硬浮点 | 小端 | Raspberry Pi(32位系统) |
4.2 如果 mkspecs 目录中没有你用的编译器怎么办?
假设你正在用的是 csky-abiv2-ux-linuxv3615 工具链,而 mkspecs/ linux-csky-ux-g++不存在怎么办?你可以手动创建它:
- 第一步:准备交叉工具链路径(假设)
/usr/local/arm/csky-abiv2-ux-linuxv3615/
├── bin/
│ ├── csky-linux-uclibcabiv2-gcc
│ ├── csky-linux-uclibcabiv2-g++
│ ├── csky-linux-uclibcabiv2-ar
│ └── ...
├── libc/
├── include/
└── ...
- 第二步:创建 Qt 的 mkspec 平台目录
cd ~/qt_src/qt-everywhere-src-5.15.2/qtbase/mkspecs
cp -r linux-arm-gnueabi-g++ linux-csky-ux-g++
如果没有 linux-arm-gnueabi-g++,可以复制任意近似平台的 mkspec,例如 linux-g++,然后改名。
- 第三步:编辑 linux-csky-ux-g++/qmake.conf
用你实际的编译器前缀(如 csky-linux-uclibcabiv2-)修改内容如下:
# qmake configuration for building with csky-linux-uclibcabiv2-g++MAKEFILE_GENERATOR = UNIX
CONFIG += incremental
QMAKE_INCREMENTAL_STYLE = sublibinclude(../common/linux.conf)
include(../common/gcc-base-unix.conf)
include(../common/g++-unix.conf)# 交叉编译器
QMAKE_CC = csky-linux-uclibcabiv2-gcc
QMAKE_CXX = csky-linux-uclibcabiv2-g++
QMAKE_LINK = csky-linux-uclibcabiv2-g++
QMAKE_LINK_SHLIB = csky-linux-uclibcabiv2-g++# 工具链工具
QMAKE_AR = csky-linux-uclibcabiv2-ar cqs
QMAKE_OBJCOPY = csky-linux-uclibcabiv2-objcopy
QMAKE_NM = csky-linux-uclibcabiv2-nm -P
QMAKE_STRIP = csky-linux-uclibcabiv2-stripload(qt_config)
- 第四步:配置 Qt 的 configure 脚本时使用它
你的配置脚本中的平台参数应修改为:
-xplatform linux-csky-ux-g++
环境变量也对应的修改
4.3 QT各个模块的作用
按需选择编译
模块名 | 功能说明 | 是否建议保留 |
---|---|---|
qtbase | Qt 的核心模块,包含 QtCore、QtGui、QtWidgets | ✅必须保留 |
qtdeclarative | QML 与 QtQuick 引擎支持 | ⚠️可选 |
qttools | Qt 工具链(如 lupdate, designer 等) | ⚠️可选 |
qtserialport | 串口支持 | ⚠️可选 |
qtsvg | SVG 图像支持 | ⚠️可选 |
qtmultimedia | 音视频播放、摄像头等 | ⚠️可选 |
qtcharts | 图表控件 | ⚠️可选 |
qtnetworkauth | OAuth 授权支持 | ❌可跳过 |
qtconnectivity | 蓝牙、NFC 等 | ❌可跳过 |
qtserialbus | CAN、Modbus 等总线通信支持 | ⚠️可选 |
qtwebsockets | WebSocket 通信支持 | ⚠️可选 |
qtwebchannel | Web 与 Qt 通信桥接(QWebChannel) | ⚠️可选 |
qtimageformats | 额外图像格式支持,如 tiff/webp/mng | ⚠️可选 |
qtxmlpatterns | XML/XPath/XQuery 处理 | ❌可跳过 |
qtscxml | 状态机 XML 支持 | ❌可跳过 |
qtscript | QtScript 支持(已废弃) | ❌强烈建议跳过 |
qtwebengine | Chromium 内核浏览器支持,依赖重 | ❌建议跳过 |
qtwebview | 嵌入浏览器控件 | ❌建议跳过 |
qtlocation | 地图与定位服务 | ❌可跳过 |
qtremoteobjects | 分布式对象(远程调用) | ❌可跳过 |
qtpurchasing | 应用内购买支持 | ❌可跳过 |
qtactiveqt | 与 ActiveX 交互,仅用于 Windows | ❌可跳过 |
qtwinextras | Windows 特有控件与特性支持 | ❌可跳过 |
qtx11extras | X11 特性封装,适用于 X11 环境 | ❌可跳过 |
qtmacextras | macOS 特性封装 | ❌可跳过 |
qtandroidextras | Android 平台特性支持 | ❌可跳过 |
qtgamepad | 游戏手柄支持 | ❌可跳过 |
qt3d | 3D 图形支持 | ❌可跳过 |
qtdatavis3d | 三维数据图表 | ❌可跳过 |
qtquick3d | Qt Quick 3D 模块 | ❌可跳过 |
qtvirtualkeyboard | 虚拟键盘(触摸屏键盘) | ⚠️可选 |
qtgraphicaleffects | QML 图形特效模块 | ⚠️可选 |
qtquickcontrols / qtquickcontrols2 | QML 控件 | ⚠️可选 |
qtquicktimeline | 时间轴动画控制模块 | ⚠️可选 |
qtlottie | 播放 Lottie 动画 JSON | ⚠️可选 |
qtsensors | 传感器支持 | ❌可跳过 |
qtspeech | 文本转语音支持 | ❌可跳过 |
qtdoc | Qt 文档模块,不影响功能 | ❌建议跳过 |
qttranslations | 多语言翻译文件 | ❌建议跳过 |
qtwebglplugin | WebGL 插件(浏览器用) | ❌建议跳过 |