在 Linux 下用 C++ 进行交叉编译,核心思想是:
在 x86_64 的 Linux 上,使用“交叉编译工具链”生成可在目标平台(如 ARM、MIPS、RISC‑V 等)上运行的程序。
下面从概念 → 工具链 → 示例 → 常见问题一步一步说明。
例如:
PC (x86_64 Linux) --编译--> ARM Linux 可执行文件
一般格式:
<arch>-<vendor>-<os>-<abi>-g++
例如:
arm-linux-gnueabihf-g++
aarch64-linux-gnu-g++
arm-none-eabi-g++
mips-linux-gnu-g++
riscv64-linux-gnu-g++
sudo apt install g++-arm-linux-gnueabihf
sudo apt install g++-aarch64-linux-gnu
sudo apt install g++-riscv64-linux-gnu
安装后可用:
arm-linux-gnueabihf-g++ --version
main.cpp#include <iostream>
int main() {
std::cout << "Hello ARM!" << std::endl;
return 0;
}
arm-linux-gnueabihf-g++ main.cpp -o main_arm
file main_arm
输出示例:
main_arm: ELF 32-bit LSB executable, ARM, EABI5 version 1
✅ 说明交叉编译成功
toolchain-arm.cmakeset(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)
set(CMAKE_C_COMPILER arm-linux-gnueabihf-gcc)
set(CMAKE_CXX_COMPILER arm-linux-gnueabihf-g++)
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-arm.cmake ..
make
原因:
解决:
sudo apt install libstdc++-dev:armhf
或使用 sysroot:
--sysroot=/path/to/arm/sysroot
not found 或 illegal instruction原因:
检查:
readelf -h main_arm
一般流程:
./configure --host=arm-linux-gnueabihf
make
或 CMake:
cmake -DCMAKE_TOOLCHAIN_FILE=toolchain.cmake
| 平台 | 编译器 |
|---|---|
| ARM32 Linux | arm-linux-gnueabihf-g++ |
| ARM64 Linux | aarch64-linux-gnu-g++ |
| 树莓派 | arm-linux-gnueabihf |
| 嵌入式裸机 | arm-none-eabi-g++ |
| RISC-V | riscv64-linux-gnu-g++ |
Linux C++ 交叉编译 = 用目标平台的 g++,而不是本机 g++
如果你愿意,可以告诉我:
我可以给你完整可跑的编译命令或 Docker 方案。