温馨提示×

ubuntu c++如何交叉编译

小樊
45
2026-08-01 21:57:55
栏目: 编程语言

在 Ubuntu 上做 C++ 交叉编译,核心思路是:
在当前机器(Ubuntu)上,用“交叉编译器”生成能在目标平台(如 ARM、RISC‑V、Windows 等)上运行的可执行文件

下面按常见场景一步一步说明。


一、最常见:Ubuntu → ARM(如树莓派、嵌入式 Linux)

1️⃣ 安装交叉编译工具链

ARM 32 位(armhf)

sudo apt update
sudo apt install gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf

ARM 64 位(aarch64)

sudo apt install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu

验证:

arm-linux-gnueabihf-g++ --version
aarch64-linux-gnu-g++ --version

2️⃣ 编写测试程序

// main.cpp
#include <iostream>

int main() {
    std::cout << "Hello cross compile!" << std::endl;
    return 0;
}

3️⃣ 交叉编译

ARM 32 位

arm-linux-gnueabihf-g++ main.cpp -o hello_arm

ARM 64 位

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

4️⃣ 检查文件架构

file hello_arm

输出类似:

hello_arm: ELF 32-bit LSB executable, ARM, ...

表示该文件 不能在 x86 Ubuntu 上运行,只能放到 ARM 设备上运行。


二、Ubuntu → Windows(生成 .exe)

方法一:MinGW-w64(推荐)

sudo apt install mingw-w64

编译 64 位 Windows 程序

x86_64-w64-mingw32-g++ main.cpp -o hello.exe

编译 32 位 Windows 程序

i686-w64-mingw32-g++ main.cpp -o hello.exe

✅ 生成的 hello.exe 可直接在 Windows 运行。


三、Ubuntu → RISC‑V

sudo apt install gcc-riscv64-linux-gnu g++-riscv64-linux-gnu
riscv64-linux-gnu-g++ main.cpp -o hello_riscv

四、使用 CMake 进行交叉编译(工程级)

1️⃣ 创建工具链文件

toolchain-arm.cmake

set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)

set(CMAKE_C_COMPILER arm-linux-gnueabihf-gcc)
set(CMAKE_CXX_COMPILER arm-linux-gnueabihf-g++)

2️⃣ 使用 CMake 编译

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

✅ 非常适合大型 C++ 项目。


五、常见问题

❓ 为什么不能直接运行交叉编译的程序?

因为 CPU 架构不同(x86 ≠ ARM)。


❓ 交叉编译时找不到头文件 / 库?

需要:

  • 使用 目标平台的 sysroot
  • 或自己交叉编译依赖库

示例:

--sysroot=/path/to/target/sysroot

❓ 如何确认目标平台架构?

uname -m
输出 含义
x86_64 64 位 Intel/AMD
aarch64 ARM 64 位
armv7l ARM 32 位

六、总结速查表

目标平台 编译器
ARM 32 arm-linux-gnueabihf-g++
ARM 64 aarch64-linux-gnu-g++
Windows x86_64-w64-mingw32-g++
RISC-V riscv64-linux-gnu-g++

如果你愿意,可以告诉我:

  • ✅ 目标平台(ARM / Windows / 嵌入式)
  • ✅ 是否使用 CMake
  • ✅ 是否有第三方库(OpenCV、Boost 等)

我可以给你 完全针对你项目的交叉编译方案

0