在 Linux 下进行 C++ 交叉编译(Cross Compilation),核心思想是:
在 x86_64 的主机(Host)上,编译出能在目标平台(Target,如 ARM、MIPS、RISC‑V)上运行的程序。
下面按「原理 → 工具链 → 配置方式 → 示例 → 常见坑」系统说明。
普通编译:
源码 -> 本机编译器 -> 本机可执行文件
交叉编译:
源码 -> 交叉编译器(如 arm-linux-gnueabihf-g++)-> 目标平台可执行文件
关键点:
arm-linux-gnueabihf-g++)sudo apt install gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf
sudo apt install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu
sudo apt install gcc-mips-linux-gnu g++-mips-linux-gnu
验证:
arm-linux-gnueabihf-g++ --version
例如:
arm-none-linux-gnueabihf示例:
export CROSS_COMPILE=~/toolchain/bin/arm-linux-gnueabihf-
// 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
输出应类似:
ELF 32-bit LSB executable, ARM, ...
toolchain-arm.cmake
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)
set(CROSS_COMPILE arm-linux-gnueabihf-)
set(CMAKE_C_COMPILER ${CROSS_COMPILE}gcc)
set(CMAKE_CXX_COMPILER ${CROSS_COMPILE}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
如果程序依赖:
必须指定目标平台的 sysroot:
--sysroot=/path/to/target/sysroot
CMake 示例:
set(CMAKE_SYSROOT /opt/target/sysroot)
或:
arm-linux-gnueabihf-g++ main.cpp \
--sysroot=/opt/target/sysroot \
-I/opt/target/sysroot/usr/include \
-L/opt/target/sysroot/usr/lib
CXX = arm-linux-gnueabihf-g++
CXXFLAGS = -Wall
main: main.cpp
$(CXX) $(CXXFLAGS) main.cpp -o main
clean:
rm -f main
cannot execute binary file✅ 你在主机上运行了 ARM 程序
✅ 必须在目标板或 QEMU 中运行
✅ 使用了主机 /usr/include
✅ 必须指定 --sysroot
✅ 编译器和 sysroot 不匹配 ✅ 确认工具链与目标系统一致
qemu-arm ./main_arm
scp main_arm board:/tmp
ssh board ./main_arm
Linux C++ 交叉编译 = 正确的交叉编译器 + 正确的 sysroot + 正确的 CMake/Makefile 配置
如果你愿意,可以告诉我:
我可以给你 完全可复制的配置示例。