温馨提示×

linux c++配置怎么交叉编译

小樊
34
2026-09-26 07:37:21
栏目: 编程语言

在 Linux 下用 C++ 进行交叉编译,核心就是:
用“交叉编译工具链”替代系统默认的 gcc/g++。下面按步骤说明。


一、什么是交叉编译

交叉编译 = 在 A 架构/系统(如 x86_64 Linux) 上
编译出 B 架构/系统(如 ARM、aarch64、MIPS) 可执行的程序。

例如:

  • x86_64 Ubuntu → ARM Linux
  • x86_64 → RISC-V
  • Linux → Windows(MinGW)

二、安装交叉编译工具链

1️⃣ 常见工具链命名规则

<架构>-<厂商>-<系统>-<库>-gcc/g++

例如:

  • arm-linux-gnueabihf-g++
  • aarch64-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

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

1️⃣ 源代码

// main.cpp
#include <iostream>
int main() {
    std::cout << "Hello Cross Compile" << std::endl;
    return 0;
}

2️⃣ 使用交叉编译器

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

3️⃣ 查看文件类型

file main_arm

输出类似:

main_arm: ELF 64-bit LSB executable, ARM aarch64

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

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

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

交叉编译时 不能用主机的库:

✅ 正确做法

  • 使用 目标平台的库
  • 放在 sysroot 或指定路径
aarch64-linux-gnu-g++ main.cpp \
  -I/path/to/arm/include \
  -L/path/to/arm/lib \
  -lxxx

CMake 中:

set(CMAKE_SYSROOT /path/to/arm/sysroot)

六、常见坑

❌ 用错编译器(默认 g++)
❌ 链接了 x86 的 .so
❌ 头文件版本不一致
❌ 没有指定 --sysroot

✅ 建议:

  • 用 file 验证
  • 用 readelf -h 看架构
  • 用 ldd 在目标机验证

七、常见目标平台对照表

目标平台 编译器
ARM32 arm-linux-gnueabihf-g++
ARM64 aarch64-linux-gnu-g++
MIPS mips-linux-gnu-g++
RISC-V riscv64-linux-gnu-g++
Windows x86_64-w64-mingw32-g++

如果你有:

  • 具体 目标板型号
  • 使用的 库(如 OpenCV、Qt)
  • 是否用 Buildroot / Yocto

我可以给你更精确的配置示例。

0 踩