温馨提示×

linux c++如何交叉编译

小樊
43
2026-09-02 03:03:49
栏目: 编程语言

在 Linux 下用 C++ 进行交叉编译,核心思想是:
在 x86_64 的 Linux 上,使用“交叉编译工具链”生成可在目标平台(如 ARM、MIPS、RISC‑V 等)上运行的程序

下面从概念 → 工具链 → 示例 → 常见问题一步一步说明。


一、什么是交叉编译

  • 本地编译:在 x86 上编译,在 x86 上运行
  • 交叉编译:在 x86 上编译,在 ARM / 其他架构上运行

例如:

PC (x86_64 Linux)  --编译-->  ARM Linux 可执行文件

二、交叉编译工具链

1. 常见工具链命名规则

一般格式:

<arch>-<vendor>-<os>-<abi>-g++

例如:

arm-linux-gnueabihf-g++
aarch64-linux-gnu-g++
arm-none-eabi-g++
mips-linux-gnu-g++
riscv64-linux-gnu-g++

2. 安装交叉编译器(Ubuntu 示例)

ARM 32 位(硬浮点)

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

ARM 64 位

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

RISC-V

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

安装后可用:

arm-linux-gnueabihf-g++ --version

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

1. 源代码 main.cpp

#include <iostream>

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

2. 使用交叉编译器编译

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

3. 查看文件类型

file main_arm

输出示例:

main_arm: ELF 32-bit LSB executable, ARM, EABI5 version 1

✅ 说明交叉编译成功


四、使用 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++)

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-arm.cmake ..
make

五、交叉编译时的常见问题

1. 找不到头文件 / 库

原因:

  • 使用的是 主机(x86)的库
  • 目标平台库未安装

解决:

  • 安装目标平台开发库
sudo apt install libstdc++-dev:armhf

或使用 sysroot:

--sysroot=/path/to/arm/sysroot

2. 运行报 not foundillegal instruction

原因:

  • CPU 架构不匹配
  • 浮点 ABI 不一致(softfp / hardfp)

检查:

readelf -h main_arm

3. 第三方库如何交叉编译

一般流程:

./configure --host=arm-linux-gnueabihf
make

或 CMake:

cmake -DCMAKE_TOOLCHAIN_FILE=toolchain.cmake

六、常见目标平台示例

平台 编译器
ARM32 Linux arm-linux-gnueabihf-g++
ARM64 Linux aarch64-linux-gnu-g++
树莓派 arm-linux-gnueabihf
嵌入式裸机 arm-none-eabi-g++
RISC-V riscv64-linux-gnu-g++

七、总结一句话

Linux C++ 交叉编译 = 用目标平台的 g++,而不是本机 g++

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

  • 目标平台(ARM?Raspberry Pi?嵌入式?)
  • 是否用 CMake
  • 是否依赖第三方库

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

0