在 Ubuntu 上交叉编译 C++,通常指:在 x86_64 的 Ubuntu 上,编译出能在其他架构(如 ARM、RISC-V、MIPS 等)上运行的程序。下面按常见场景给你一份清晰指南。
arm-linux-gnueabihf-g++ 等sudo apt update
sudo apt install g++-arm-linux-gnueabihf
使用:
arm-linux-gnueabihf-g++ main.cpp -o main_arm
sudo apt install g++-aarch64-linux-gnu
使用:
aarch64-linux-gnu-g++ main.cpp -o main_arm64
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
说明交叉编译成功。
如果目标板使用了特定的库(如 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 通常来自:
debootstrap 创建toolchain.cmakeset(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)
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
| 目标平台 | 编译器 |
|---|---|
| ARM32 | arm-linux-gnueabihf-g++ |
| ARM64 | aarch64-linux-gnu-g++ |
| RISC-V | riscv64-linux-gnu-g++ |
| MIPS | mips-linux-gnu-g++ |
如果你能告诉我:
我可以给你更精确的交叉编译配置。