直接用宿主机(比如 x86_64 Linux)编译出能在 ARM 或 AArch64 设备上运行的 C++ 程序,靠的是交叉编译工具链 —— 它不依赖目标机环境,只在开发机上完*部构建。
核心是获取一套能生成 ARM/AARCH64 机器码的 gcc/g++ 工具链。常见方式有:
sudo apt install g++-arm-linux-gnueabihf(对应 ARM32)或 g++-aarch64-linux-gnu(对应 AArch64)aarch64-linux-gnu-gcc),解压后加入 $PATH
验证是否就绪:运行 aarch64-linux-gnu-g++ --version 或 arm-linux-gnueabihf-g++ --version,看到版本号即表示可用。
用交叉编译器替代本地 g++,显式指定目标架构相关参数:
aarch64-linux-gnu-g++ -o hello hello.cpp
-static-libstdc++ 避免目标机缺失动态库--sysroot=/path/to/aarch64-rootfs,让编译器从该路径查找头文件和库,避免混用宿主机头文件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第三方库不能直接用 x86_64 版本,必须为 ARM/AARCH64 重新编译:
./bootstrap.s
h --prefix=/opt/aarch64-boost && ./b2 toolset=gcc-aarch64 address-model=64 link=static cxxflags="--sysroot=/opt/sysroots/aarch64-linux"
-DCMAKE_TOOLCHAIN_FILE,和主工程一致即可aarch64-linux)