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、全志、瑞芯微等开发板。

相关推荐
勤劳打代码2 小时前
Flutter 架构指南 —— windows 平台安装拆解
windows·架构
TlSfoward2 小时前
TLSFOWARD自动化抓包工具
运维·自动化
麦兜和小可的舅舅2 小时前
从原理到实战:Linux 系统性能诊断核心指标全解析及生产系统故障分析复盘
大数据·linux·运维
云飞云共享云桌面3 小时前
河北钣金工厂10个solidworks设计共享一台高性能服务器的云桌面方案
运维·服务器·3d·自动化·负载均衡·制造
wbs_scy3 小时前
仿 muduo 高并发服务器项目:实现 Connection 连接管理模块,并整合 Any 上下文
运维·服务器·网络
风123456789~3 小时前
【Linux专栏】history常用命令
linux·运维·服务器
爱学习的程序媛3 小时前
SIP抓包调试、故障排查与项目上线实战手册
运维·wireshark·呼叫中心·联络中心·sip协议·sip信令
fpcc4 小时前
Linux 7.1介绍
linux·运维
三8444 小时前
磁盘管理/fdisk
linux·运维·服务器