最近需要将一个 C++ 程序部署到 RK3588 Debian 系统运行,领导提供了一套交叉编译工具链:
rk3588_5.15.2.tar.gz
工具链位于:
rk3588_5.15.2/host/bin/
其中包含:
aarch64-buildroot-linux-gnu-gcc
aarch64-buildroot-linux-gnu-g++
本文记录从工具链验证、CMake 配置到成功编译 ARM64 程序的完整流程。
一、环境说明
开发环境:
- Windows 11
- VMware Workstation
- Debian x86_64
- CMake
- Buildroot Toolchain
目标环境:
- RK3588
- Debian ARM64(aarch64)
整体流程如下:
Windows
│
│ 编写代码
▼
Debian x86_64 虚拟机
│
│ aarch64-buildroot-linux-gnu-g++
▼
ARM64 ELF
│
│ SCP / WinSCP
▼
RK3588 Debian
二、准备交叉编译工具链
将 SDK 解压到:
/opt/rk3588_sdk/
目录结构例如:
/opt/rk3588_sdk/
├── rk3588_5.15.2
│ └── host
│ └── bin
│ ├── aarch64-buildroot-linux-gnu-gcc
│ └── aarch64-buildroot-linux-gnu-g++
三、验证工具链是否正常
进入工具链目录:
cd /opt/rk3588_sdk/rk3588_5.15.2/host/bin
查看版本:
./aarch64-buildroot-linux-gnu-g++ --version
查看目标平台:
./aarch64-buildroot-linux-gnu-g++ -dumpmachine
正常输出:
aarch64-buildroot-linux-gnu
查看默认 sysroot:
./aarch64-buildroot-linux-gnu-g++ -print-sysroot
如果能够正常输出 sysroot 路径,说明工具链基本可用。
四、安装 CMake
Debian 默认可能未安装 CMake。
安装:
sudo apt update
sudo apt install cmake
验证:
cmake --version
五、创建 Toolchain 文件
新建:
nano /opt/rk3588_sdk/toolchain-rk3588.cmake
内容如下:
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR aarch64)
# 你的SDK路径
set(TOOLCHAIN_DIR /home/jkt/rk3588_5.15.2)
# C编译器
set(CMAKE_C_COMPILER
${TOOLCHAIN_DIR}/host/bin/aarch64-buildroot-linux-gnu-gcc)
# C++编译器
set(CMAKE_CXX_COMPILER
${TOOLCHAIN_DIR}/host/bin/aarch64-buildroot-linux-gnu-g++)
# 如果SDK里面有sysroot,需要填写
set(CMAKE_SYSROOT
${TOOLCHAIN_DIR}/host/aarch64-buildroot-linux-gnu/sysroot)
set(CMAKE_FIND_ROOT_PATH
${CMAKE_SYSROOT})
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
六、编写测试程序
main.cpp:
#include <iostream>
int main()
{
std::cout << "Hello RK3588!" << std::endl;
return 0;
}
七、编写 CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(test_rk3588)
set(CMAKE_CXX_STANDARD 17)
add_executable(
test_rk3588
main.cpp
)
target_link_libraries(
test_rk3588
pthread
)
八、开始交叉编译
创建编译目录:
mkdir build
cd build
生成 Makefile:
cmake .. \
-DCMAKE_TOOLCHAIN_FILE=/opt/rk3588_sdk/toolchain-rk3588.cmake
开始编译:
make -j8
成功后会生成:
test_rk3588
九、验证是否编译为 ARM 程序
执行:
file test_rk3588
输出类似:
ELF 64-bit LSB pie executable,
ARM aarch64
说明程序已经成功交叉编译为 ARM64 可执行文件。
十、查看动态依赖
由于当前开发机是 x86_64,因此不要使用:
ldd test_rk3588
否则会提示不是可执行程序或无法识别。
应使用工具链提供的 readelf:
/opt/rk3588_sdk/rk3588_5.15.2/host/bin/aarch64-buildroot-linux-gnu-readelf -d test_rk3588
例如输出:
NEEDED Shared library:
libpthread.so.0
libstdc++.so.6
libm.so.6
libgcc_s.so.1
libc.so.6
ld-linux-aarch64.so.1
这些均属于 Debian ARM64 系统基础运行库,通常由目标系统提供。
十一、第三方库如何处理
需要区分两类库。
系统运行库
例如:
libc.so.6
libstdc++.so.6
libpthread.so.0
libm.so.6
这些一般无需自行打包。
第三方库
例如:
PortAudio
CSerialPort
SQLite(自行编译)
必须使用相同的 ARM64 工具链重新编译。
不能直接使用:
- Windows 编译出的库
- x86_64 Linux 编译出的库
否则程序无法链接,或者运行时报:
Exec format error
接下来就只差将程序打包拷贝到目标系统上,然后解压运行即可。
总结
整个交叉编译流程的核心有以下几点:
- 使用 Buildroot 提供的
aarch64-buildroot-linux-gnu-gcc/g++编译 ARM64 程序。 - 推荐使用 CMake 管理项目,通过
toolchain.cmake切换不同平台的编译器。 - 交叉编译生成的 ARM 程序不能在 x86_64 开发机直接运行,只能放到目标设备运行。
- 使用
file命令可以验证生成程序的架构,使用readelf -d查看程序依赖。 - 系统运行库通常由目标 Debian 系统提供,无需打包;第三方库(如 PortAudio、CSerialPort)需要使用同一套工具链重新编译。
- 文件传输推荐使用 WinSCP 或 scp,相比 VMware 共享文件夹更加稳定可靠。
以上流程同样适用于大多数基于 GCC 交叉工具链的 ARM Linux 平台,例如 RK3568、RK3588、全志、瑞芯微等开发板。