在 Ubuntu 上用 C++ 进行交叉编译,核心思路是:
在本机(x86_64 Ubuntu)上使用“交叉编译工具链”生成目标平台(如 ARM、RISC-V、aarch64 等)的可执行文件。
下面按常见场景一步步说明。
| 目标平台 | 工具链前缀 |
|---|---|
| ARM 32 位 | arm-linux-gnueabihf- |
| ARM 64 位 | aarch64-linux-gnu- |
| RISC-V 32 | riscv32-linux-gnu- |
| RISC-V 64 | riscv64-linux-gnu- |
# ARM 32 位
sudo apt update
sudo apt install gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf
# ARM 64 位
sudo apt install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu
验证:
aarch64-linux-gnu-g++ --version
main.cpp#include <iostream>
int main() {
std::cout << "Hello ARM!" << std::endl;
return 0;
}
aarch64-linux-gnu-g++ main.cpp -o main_arm64
file main_arm64
输出类似:
main_arm64: ELF 64-bit LSB executable, ARM aarch64
✅ 说明交叉编译成功
如果你的程序依赖目标平台的库(如 OpenCV、Qt、系统库):
aarch64-linux-gnu-g++ main.cpp \
--sysroot=/path/to/target/sysroot \
-o main_arm64
sysroot 通常来自:
debootstrap 构建qemu + chroottoolchain.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
使用 QEMU 模拟运行:
sudo apt install qemu-user-static
./main_arm64
cannot find -lxxxlibxxx.so 到 sysrootillegal instruction-march=armv8-a
Ubuntu 上 C++ 交叉编译 = 安装 cross g++ + 指定目标编译器 + (必要时 sysroot)
如果你告诉我:
我可以给你完整可用的编译命令或 Docker 方案。