温馨提示×

ubuntu c++交叉编译如何做

小樊
47
2026-09-14 12:57:26
栏目: 编程语言

在 Ubuntu 上进行 C++ 交叉编译,核心思路是:
用 Ubuntu 上的编译器,生成在另一种架构/系统上运行的可执行文件。

下面按常见场景给你一套清晰做法。


一、基本概念

交叉编译三要素:

  1. 交叉编译器(toolchain)
    • 例如:arm-linux-gnueabihf-g++
  2. 目标架构
    • ARM / AArch64 / RISC-V / MIPS 等
  3. 目标系统环境(可选)
    • glibc / musl / 裸机(bare-metal)

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

1️⃣ ARM 32 位(armhf)

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

使用:

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

2️⃣ ARM 64 位(aarch64)

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

使用:

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

3️⃣ RISC-V

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

三、验证生成文件架构

file main_arm

示例输出:

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

四、CMake 交叉编译(推荐方式)

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

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️⃣ 使用 CMake 编译

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

五、链接第三方库(重点)

情况 1:目标平台有 sysroot

sudo apt install libstdc++-arm-linux-gnueabihf-dev

或复制开发板上的:

/usr/lib
/usr/include

指定 sysroot:

--sysroot=/path/to/sysroot

CMake 示例:

set(CMAKE_SYSROOT /path/to/sysroot)

情况 2:使用 vcpkg(交叉编译)

vcpkg install zlib --triplet=arm-linux

六、裸机(无 OS)交叉编译

例如 ARM Cortex-M:

sudo apt install gcc-arm-none-eabi
arm-none-eabi-g++ main.cpp -o firmware.elf

七、常见问题

❌ 运行时 not found

  • 目标板缺少对应 libstdc++.so
  • 用静态编译:
-static

❌ 架构不匹配

file 可执行文件
uname -m

八、典型应用方向

✅ 树莓派
✅ 嵌入式 Linux
✅ Android NDK
✅ 路由器 / IoT
✅ 国产芯片(飞腾、龙芯)


如果你能告诉我:

  • 目标平台(如树莓派 / 开发板 / 芯片型号)
  • 是否用 CMake / Makefile
  • 是否需要第三方库

我可以直接给你一套 可复制的完整编译命令。

0 踩