RK3588 Debian 交叉编译环境搭建(Windows + VMware Debian + CMake)

最近需要将一个 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

接下来就只差将程序打包拷贝到目标系统上,然后解压运行即可。

总结

整个交叉编译流程的核心有以下几点:

  1. 使用 Buildroot 提供的 aarch64-buildroot-linux-gnu-gcc/g++ 编译 ARM64 程序。
  2. 推荐使用 CMake 管理项目,通过 toolchain.cmake 切换不同平台的编译器。
  3. 交叉编译生成的 ARM 程序不能在 x86_64 开发机直接运行,只能放到目标设备运行。
  4. 使用 file 命令可以验证生成程序的架构,使用 readelf -d 查看程序依赖。
  5. 系统运行库通常由目标 Debian 系统提供,无需打包;第三方库(如 PortAudio、CSerialPort)需要使用同一套工具链重新编译。
  6. 文件传输推荐使用 WinSCP 或 scp,相比 VMware 共享文件夹更加稳定可靠。

以上流程同样适用于大多数基于 GCC 交叉工具链的 ARM Linux 平台,例如 RK3568、RK3588、全志、瑞芯微等开发板。

相关推荐
中云DDoS CC防护蔡蔡20 分钟前
DDOS和CC攻击谁更可怕
运维·服务器·经验分享·网络安全·ddos
Ruiery27 分钟前
Linux 6.6内核内存管理深度解析(十六):mmap — 用户态“申请内存“的真相
linux·运维·服务器
ClickHouseDB32 分钟前
ClickHouse Cloud 与 Snowflake 实时性价比对比:CostBench 测试中的 412 倍差距来
运维·数据库·系统架构
欧米欧1 小时前
Linux系统篇(七),环境变量的底层溯源,核心获取机制与安全应用
linux·运维·服务器
Ruiery1 小时前
Linux 6.6内核内存管理深度解析(十八):KASLR 内核地址空间随机化
linux·运维·服务器·安全
todoitbo2 小时前
群晖NAS部署JmalCloud:Docker安装、文件管理、博客与公网访问完整教程
运维·docker·容器
时间售卖铺2 小时前
触发器与函数实战:MySQL高效编程秘诀
运维·数据库·mysql·云原生
前端精髓2 小时前
调用大模型API
运维·服务器·microsoft
跨境小彭3 小时前
Temu 全托管模式下,SKU 利润核算的实践复盘
大数据·运维·人工智能·自动化·temu
李纲明3 小时前
WordPress 定时发布不跑、备份邮件延误:先核 WP-Cron 触发与回环,再改系统 Cron
运维·wordpress·定时任务·devdiy·wp-cron