在 Linux 下用 C++ 进行交叉编译,核心就是:
用“交叉编译工具链”替代系统默认的 gcc/g++。下面按步骤说明。
交叉编译 = 在 A 架构/系统(如 x86_64 Linux) 上
编译出 B 架构/系统(如 ARM、aarch64、MIPS) 可执行的程序。
例如:
<架构>-<厂商>-<系统>-<库>-gcc/g++
例如:
arm-linux-gnueabihf-g++aarch64-linux-gnu-g++riscv64-linux-gnu-g++# ARM 32 位
sudo apt install g++-arm-linux-gnueabihf
# ARM 64 位
sudo apt install g++-aarch64-linux-gnu
# RISC-V
sudo apt install g++-riscv64-linux-gnu
// main.cpp
#include <iostream>
int main() {
std::cout << "Hello Cross Compile" << std::endl;
return 0;
}
aarch64-linux-gnu-g++ main.cpp -o main_arm
file main_arm
输出类似:
main_arm: ELF 64-bit LSB executable, ARM aarch64
toolchain-arm.cmake
set(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
交叉编译时 不能用主机的库:
aarch64-linux-gnu-g++ main.cpp \
-I/path/to/arm/include \
-L/path/to/arm/lib \
-lxxx
CMake 中:
set(CMAKE_SYSROOT /path/to/arm/sysroot)
❌ 用错编译器(默认 g++)
❌ 链接了 x86 的 .so
❌ 头文件版本不一致
❌ 没有指定 --sysroot
✅ 建议:
file 验证readelf -h 看架构ldd 在目标机验证| 目标平台 | 编译器 |
|---|---|
| ARM32 | arm-linux-gnueabihf-g++ |
| ARM64 | aarch64-linux-gnu-g++ |
| MIPS | mips-linux-gnu-g++ |
| RISC-V | riscv64-linux-gnu-g++ |
| Windows | x86_64-w64-mingw32-g++ |
如果你有:
我可以给你更精确的配置示例。