命令行编译适合 CI/CD 流水线或无桌面服务器环境,与 Qt Creator 使用相同的工具链和 sysroot。本章覆盖三个场景:裸 g++ 验证工具链、CMake 交叉编译、qmake 交叉编译。
前提:SDK 位于
/home/lckfb/TaishanPi-3-Linux,Buildroot 已完成首次编译(参见 Buildroot Qt 编译环境)。 如需将编译产物部署到板子运行,请先完成通信通道配置。
交叉编译工具链说明
工具链说明
重要:Buildroot 路线必须使用 Buildroot 自带的工具链
Buildroot 全量编译后会在 buildroot/output/rockchip_rk3576/host/bin/ 下生成一套 GCC 12.4.0 工具链(前缀 aarch64-buildroot-linux-gnu-)。Qt 5.15.11 和 sysroot 中的所有库都是用这套编译器构建的。
SDK 预置的 GCC 10.3.1(prebuilts/gcc/ 下,前缀 aarch64-rockchip1031-linux-gnu-)用于编译 kernel 和 u-boot,不能用于编译 Qt 应用——两者 C++ ABI 不兼容(libstdc++ 符号版本不匹配)。
| 项目 | 值 |
|---|---|
| 编译器路径 | buildroot/output/rockchip_rk3576/host/bin/ |
| 编译器前缀 | aarch64-buildroot-linux-gnu- |
| GCC 版本 | 12.4.0 |
| sysroot | buildroot/output/rockchip_rk3576/host/aarch64-buildroot-linux-gnu/sysroot(staging/ 是其符号链接) |
配置 PATH 说明
每次打开新终端时执行:
export PATH=/home/lckfb/TaishanPi-3-Linux/buildroot/output/rockchip_rk3576/host/bin:$PATH验证:
aarch64-buildroot-linux-gnu-gcc --version
# 预期输出包含 aarch64-buildroot-linux-gnu-gcc.br_real (Buildroot -g8c544b52-dirty) 12.4.02
不建议将此路径写入
~/.bashrc,因为它会与 SDK 预置工具链冲突。需要时手动 export 即可。
用 g++ 验证工具链
先用最简单的程序确认工具链正常:
// hello.cpp
#include <iostream>
int main() {
std::cout << "Hello from TaishanPi-3M!" << std::endl;
return 0;
}2
3
4
5
6
aarch64-buildroot-linux-gnu-g++ hello.cpp -o hello
file hello
# 期望输出: ELF 64-bit LSB executable, ARM aarch64, ...2
3
看到 ARM aarch64 说明工具链正常。输出 x86-64 则说明 PATH 未生效,重新执行上一节的 export 命令。
CMake 交叉编译 Qt 程序
CMake 是推荐的构建方式。Buildroot 自带 toolchainfile.cmake,无需手写工具链文件。
项目结构
tspi-sysmonitor/
├── CMakeLists.txt
├── tspi-sysmonitor.pro
├── main.cpp
├── sysmonitor.h
└── sysmonitor.cpp2
3
4
5
6
完整源码请参考示例项目 tspi-sysmonitor。
CMakeLists.txt
cmake_minimum_required(VERSION 3.16)
project(tspi-sysmonitor LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_AUTOMOC ON)
find_package(Qt5 REQUIRED COMPONENTS Widgets Network)
add_executable(tspi-sysmonitor
main.cpp
sysmonitor.cpp
)
target_link_libraries(tspi-sysmonitor PRIVATE Qt5::Widgets Qt5::Network)2
3
4
5
6
7
8
9
10
11
12
13
14
15
配置和编译
cd tspi-sysmonitor
mkdir build && cd build
cmake .. \
-DCMAKE_TOOLCHAIN_FILE=/home/lckfb/TaishanPi-3-Linux/buildroot/output/rockchip_rk3576/host/share/buildroot/toolchainfile.cmake \
-DCMAKE_PREFIX_PATH=/home/lckfb/TaishanPi-3-Linux/buildroot/output/rockchip_rk3576/staging/usr/lib/cmake \
-DCMAKE_BUILD_TYPE=Release
make -j$(nproc)2
3
4
5
6
7
关键参数说明:
| 参数 | 作用 |
|---|---|
CMAKE_TOOLCHAIN_FILE | Buildroot 自动生成的工具链文件,包含编译器、sysroot 等全部配置 |
CMAKE_PREFIX_PATH | 指向 Qt5 CMake 配置文件所在目录,让 find_package(Qt5) 能找到 Qt |
验证编译产物
$ file build/tspi-sysmonitor
tspi-sysmonitor: ELF 64-bit LSB executable, ARM aarch64, dynamically linked, ...
$ aarch64-buildroot-linux-gnu-readelf -d build/tspi-sysmonitor | grep NEEDED
(NEEDED) Shared library: [libQt5Widgets.so.5]
(NEEDED) Shared library: [libQt5Network.so.5]
(NEEDED) Shared library: [libQt5Core.so.5]
(NEEDED) Shared library: [libc.so.6]2
3
4
5
6
7
8
ARM aarch64 + 依赖 libQt5Widgets.so.5 说明编译成功。
qmake 交叉编译
Buildroot 提供的 qmake 已内嵌交叉编译配置,直接调用即可。
源码复用 示例项目 tspi-sysmonitor
编译命令
说明
如果没有找到 qmake,请查看本文档开头的 配置 PATH 章节,确认 host/bin/ 已加入 PATH。
# 确认 Buildroot qmake 在 PATH 中
$ which qmake
/home/lckfb/TaishanPi-3-Linux/buildroot/output/rockchip_rk3576/host/bin/qmake
# 生成 Makefile 并编译
qmake tspi-sysmonitor.pro
make -j$(nproc)2
3
4
5
6
7
验证产物
$ file tspi-sysmonitor
tspi-sysmonitor: ELF 64-bit LSB executable, ARM aarch64, version 1 (GNU/Linux), dynamically linked, ...2
如果误用了开发机 apt 安装的 qmake,会报
Unknown spec错误——用which qmake确认路径指向 Buildroot 的host/bin/qmake。
编译问题排查
1. command not found: aarch64-buildroot-linux-gnu-g++
工具链不在 PATH 中。重新执行 export PATH=.../host/bin:$PATH。
2. Could not find a package configuration file provided by "Qt5"
find_package(Qt5) 找不到 Qt5Config.cmake。确认文件存在:
find /home/lckfb/TaishanPi-3-Linux/buildroot/output/rockchip_rk3576/staging -name "Qt5Config.cmake"找到后将其所在目录传给 -DCMAKE_PREFIX_PATH。找不到说明 Buildroot 未启用 Qt,需回到 ./build.sh bconfig 确认 BR2_PACKAGE_QT5 已选中。
3. cannot find -lQt5Widgets
链接器找不到 Qt 库。检查 sysroot 中库是否存在:
ls buildroot/output/rockchip_rk3576/staging/usr/lib/libQt5Widgets*4. relocation R_X86_64_... 错误
链接了开发机的 x86_64 库,说明 CMAKE_TOOLCHAIN_FILE 未生效。确认 cmake 命令中正确指定了 toolchainfile.cmake 路径。
5. 编译产物是 x86-64 而非 ARM64
使用了开发机编译器。执行 which g++ 确认 PATH 中 Buildroot 工具链优先级高于系统路径。
下一步
命令行交叉编译的核心是两件事:Buildroot 工具链 PATH 正确,CMake 指定 toolchainfile.cmake 和 Qt PREFIX_PATH。CMake 是通用方案,qmake 更简洁但绑定 Buildroot。编译完成后用 file 和 readelf 确认产物架构和依赖。
下一步:部署运行调试