c++如何进行交叉编译 c++ arm/aarch64平台编译【教程】

c++kquote>交叉编译可在x86_64宿主机上生成ARM/AArch64可执行程序,需使用对应架构的gcc/g++工具链(如aarch64-linux-gnu-g++),配合sysroot和toolchain文件,CMake及第三方库均需适配目标平台。

直接用宿主机(比如 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++ --versionarm-linux-gnueabihf-g++ --version,看到版本号即表示可用。

编译单个 C++ 源文件

用交叉编译器替代本地 g++,显式指定目标架构相关参数:

  • 基本命令: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 build
  • cmake -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