
直接用宿主机(比如 x86_64 Linux)编译出能在 ARM 或 AArch64 设备上运行的 C++ 程序,靠的是交叉编译工具链 —— 它不依赖目标机环境,只在开发机上完成全部构建。
准备交叉编译工具链
核心是获取一套能生成 ARM/AARCH64 机器码的 gcc/g++ 工具链。常见方式有:
- 从发行版安装预编译包:Ubuntu/Debian 可用
sudo apt install g++-arm-linux-gnueabihf(对应 ARM32)或g++-aarch64-linux-gnu(对应 AArch64) - 使用 crosstool-ng 自定义构建(适合需要特定 libc 版本或内核头文件的场景)
- 下载 Linaro 或 ARM 官方提供的工具链压缩包(如
aarch64-linux-gnu-gcc),解压后加入$PATH
验证是否就绪:运行 aarch64-linux-gnu-g++ --version 或 arm-linux-gnueabihf-g++ --version,看到版本号即表示可用。
编译单个 C++ 源文件
用交叉编译器替代本地 g++,显式指定目标架构相关参数:
立即学习“C++免费学习笔记(深入)”;
- 基本命令:
aarch64-linux-gnu-g++ -o hello hello.cpp - 若需链接特定库(如静态链接 stdc++):加
-static-libstdc++避免目标机缺失动态库 - 指定 sysroot(可选但推荐):
--sysroot=/path/to/aarch64-rootfs,让编译器从该路径查找头文件和库,避免混用宿主机头文件
用 CMake 进行交叉编译
CMake 更适合项目级构建。关键在于写一个 toolchain file,例如 aarch64-toolchain.cmake:
set(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_SYSROOT /opt/sysroots/aarch64-linux) set(CMAKE_FIND_ROOT_PATH /opt/sysroots/aarch64-linux) 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 buildcmake -DCMAKE_TOOLCHAIN_FILE=../aarch64-toolchain.cmake ..make
处理依赖库(如 Boost、OpenCV)
第三方库不能直接用 x86_64 版本,必须为 ARM/AARCH64 重新编译:
- 源码编译时,传入交叉编译器和 sysroot:
./bootstrap.sh --prefix=/opt/aarch64-boost && ./b2 toolset=gcc-aarch64 address-model=64 link=static cxxflags="--sysroot=/opt/sysroots/aarch64-linux" - CMake 项目通常支持
-DCMAKE_TOOLCHAIN_FILE,和主工程一致即可 - 若用包管理器(如 Conan、vcpkg),启用交叉编译模式并指定 target triplet(如
aarch64-linux)











