温馨提示×

ubuntu如何交叉编译c++

小樊
41
2026-09-26 14:51:31
栏目: 编程语言

在 Ubuntu 上交叉编译 C++,通常指:在 x86_64 的 Ubuntu 上,编译出能在其他架构(如 ARM、RISC-V、MIPS 等)上运行的程序。下面按常见场景给你一份清晰指南。


一、基本概念

  • 宿主机(Host):你编译用的机器(Ubuntu x86_64)
  • 目标机(Target):程序运行的机器(如 ARM 开发板)
  • 交叉编译器:arm-linux-gnueabihf-g++ 等

二、安装交叉编译工具链(以 ARM 为例)

1️⃣ ARM 32 位(armhf)

sudo apt update
sudo apt install g++-arm-linux-gnueabihf

使用:

arm-linux-gnueabihf-g++ main.cpp -o main_arm

2️⃣ ARM 64 位(aarch64)

sudo apt install g++-aarch64-linux-gnu

使用:

aarch64-linux-gnu-g++ main.cpp -o main_arm64

3️⃣ RISC-V

sudo apt install g++-riscv64-linux-gnu
riscv64-linux-gnu-g++ main.cpp -o main_riscv

三、验证交叉编译结果

file main_arm

示例输出:

main_arm: ELF 32-bit LSB executable, ARM, EABI5 version 1

说明交叉编译成功。


四、指定 sysroot(重要)

如果目标板使用了特定的库(如 glibc、OpenCV、Boost),需要指定 sysroot:

aarch64-linux-gnu-g++ main.cpp \
  --sysroot=/path/to/target/sysroot \
  -I/path/to/target/sysroot/usr/include \
  -L/path/to/target/sysroot/usr/lib

sysroot 通常来自:

  • 开发板厂商 SDK
  • debootstrap 创建
  • 构建系统(Yocto / Buildroot)

五、使用 CMake 进行交叉编译(推荐)

1️⃣ 编写工具链文件 toolchain.cmake

set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR aarch64)

set(CMAKE_C_COMPILER aarch64-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++)

set(CMAKE_FIND_ROOT_PATH /path/to/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)

2️⃣ 编译

mkdir build && cd build
cmake -DCMAKE_TOOLCHAIN_FILE=toolchain.cmake ..
make

六、常见错误 & 解决

❌ cannot find crt1.o

原因:没有 sysroot 或路径不对
✅ 加 --sysroot


❌ illegal instruction

原因:CPU 架构/浮点不一致
✅ 指定 -march、-mfpu

例如:

arm-linux-gnueabihf-g++ -mfpu=neon -march=armv7-a main.cpp

七、推荐工具(进阶)

  • crosstool-NG:自定义工具链
  • Yocto / Buildroot:完整系统交叉编译
  • Docker + 交叉编译镜像:环境隔离

八、示例汇总

目标平台 编译器
ARM32 arm-linux-gnueabihf-g++
ARM64 aarch64-linux-gnu-g++
RISC-V riscv64-linux-gnu-g++
MIPS mips-linux-gnu-g++

如果你能告诉我:

  • 目标芯片型号(如 RK3399、树莓派、NXP)
  • 是否用 CMake / Makefile
  • 是否依赖第三方库

我可以给你更精确的交叉编译配置。

0 踩