温馨提示×

ubuntu c++怎样交叉编译

小樊
43
2026-09-02 08:59:58
栏目: 编程语言

在 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-

二、安装交叉编译工具链(Ubuntu)

1️⃣ 安装 ARM 交叉编译器(最常用)

# 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

三、最简单的 C++ 交叉编译示例

示例程序 main.cpp

#include <iostream>
int main() {
    std::cout << "Hello ARM!" << std::endl;
    return 0;
}

编译(ARM64 为例)

aarch64-linux-gnu-g++ main.cpp -o main_arm64

查看文件类型

file main_arm64

输出类似:

main_arm64: ELF 64-bit LSB executable, ARM aarch64

✅ 说明交叉编译成功


四、指定 sysroot(重要)

如果你的程序依赖目标平台的库(如 OpenCV、Qt、系统库):

aarch64-linux-gnu-g++ main.cpp \
  --sysroot=/path/to/target/sysroot \
  -o main_arm64

sysroot 通常来自:

  • 开发板厂家 SDK
  • 使用 debootstrap 构建
  • 使用 qemu + chroot

五、使用 CMake 进行交叉编译(推荐)

1️⃣ 编写工具链文件 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_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)

2️⃣ 编译

mkdir build && cd build
cmake -DCMAKE_TOOLCHAIN_FILE=../toolchain.cmake ..
make

六、在 Ubuntu 上运行 ARM 程序(可选)

使用 QEMU 模拟运行:

sudo apt install qemu-user-static
./main_arm64

七、常见错误 & 解决

cannot find -lxxx

  • 没有目标平台库
  • 解决:拷贝 libxxx.so 到 sysroot

illegal instruction

  • 编译架构与实际 CPU 不匹配
  • 加:
-march=armv8-a

八、总结一句话

Ubuntu 上 C++ 交叉编译 = 安装 cross g++ + 指定目标编译器 + (必要时 sysroot)

如果你告诉我:

  • 目标平台(ARM / RISC-V / 树莓派 / 开发板型号)
  • 是否用 CMake
  • 是否依赖第三方库

我可以给你完整可用的编译命令或 Docker 方案

0