在 Linux 下做 C++ 交叉编译,核心思路是:
用“host(开发机)”上的编译器,生成“target(目标机)”上可运行的程序。
下面按「概念 → 步骤 → 示例 → 常见问题」来讲。
| 名称 | 含义 |
|---|---|
| Host | 你写代码、编译的机器(如 x86_64 Ubuntu) |
| Target | 程序最终运行的机器(如 ARM、RISC-V、MIPS) |
| 交叉编译器 | 如 arm-linux-gnueabihf-g++ |
ARM 32 位(软浮点/硬浮点)
sudo apt install gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf
ARM 64 位(aarch64)
sudo apt install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu
RISC-V
sudo apt install gcc-riscv64-linux-gnu g++-riscv64-linux-gnu
hello.cpp
#include <iostream>
int main() {
std::cout << "Hello Cross Compile\n";
}
arm-linux-gnueabihf-g++ hello.cpp -o hello_arm
aarch64-linux-gnu-g++ hello.cpp -o hello_arm64
file hello_arm
输出类似:
hello_arm: ELF 32-bit LSB executable, ARM, ...
scp hello_arm user@arm-board:/tmp
ssh user@arm-board
/tmp/hello_arm
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
--sysroot=/path/to/target/sysroot
ldd hello_arm
查看依赖
arm-linux-gnueabihf-g++ main.cpp -static -o app
✅ 嵌入式 Linux(ARM)
✅ 树莓派
✅ 路由器 / IoT
✅ 国产 CPU(龙芯、飞腾)
如果你告诉我:
我可以直接给你可复制的完整命令。