温馨提示×

CentOS如何配置C++交叉编译

小樊
35
2026-08-04 02:01:49
栏目: 编程语言

CentOS 上配置 C++ 交叉编译环境,通常取决于你的 目标平台(架构 / 系统)。下面我按最常见场景给你一个完整、可操作的说明,并附上示例。


一、明确交叉编译目标

先确认你要交叉编译到什么平台,例如:

目标平台 说明
ARM 32 位 arm-linux-gnueabihf
ARM 64 位 aarch64-linux-gnu
MIPS mips-linux-gnu
RISC-V riscv64-linux-gnu
老版本 glibc 低版本 Linux

下面以 ARM64(aarch64) 为例,其他架构几乎一样。


二、CentOS 安装交叉编译工具链(推荐方式)

✅ 方式 1:使用 yum / dnf(最简单)

CentOS 7 / 8 / Stream 都支持:

# 查看可用交叉编译器
yum search aarch64-linux-gnu

# 安装 ARM64 交叉编译器
sudo yum install -y gcc-aarch64-linux-gnu g++-aarch64-linux-gnu

验证:

aarch64-linux-gnu-g++ --version

✅ 方式 2:使用 EPEL(如果默认仓库没有)

sudo yum install -y epel-release
sudo yum install -y gcc-aarch64-linux-gnu g++-aarch64-linux-gnu

三、编写并交叉编译 C++ 程序

示例程序 hello.cpp

#include <iostream>

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

编译(交叉编译)

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

查看文件类型

file hello_arm64

输出类似:

hello_arm64: ELF 64-bit LSB executable, ARM aarch64

✅ 说明交叉编译成功


四、指定 sysroot(非常重要)

如果目标系统 库版本不同,必须指定 sysroot,否则可能出现:

undefined reference to `std::__cxx11::basic_string`

示例:

aarch64-linux-gnu-g++ \
  --sysroot=/opt/arm64-rootfs \
  hello.cpp -o hello_arm64

sysroot 通常来自:

  • 目标设备的 rootfs
  • 官方 SDK
  • 自己制作的 rootfs

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

1️⃣ 创建 toolchain 文件

arm64-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 /opt/arm64-rootfs)
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=../arm64-toolchain.cmake ..
make

六、在 CentOS 上编译 ARM 32 位(常见)

sudo yum install -y gcc-arm-linux-gnu g++-arm-linux-gnu

编译:

arm-linux-gnueabihf-g++ test.cpp -o test_arm

七、常见错误与解决

❌ 1. arm-linux-gnu-g++: command not found

✅ 未安装交叉编译器或路径未加入 PATH


❌ 2. cannot find -lstdc++

✅ 未指定 --sysroot 或目标 rootfs 不完整


❌ 3. 编译通过,但目标设备无法运行

✅ 检查:

ldd hello_arm64

若提示 not a dynamic executable,可能是:

  • glibc 版本不匹配
  • 静态链接问题

八、是否需要自己编译交叉编译器?

一般不需要

除非你:

  • 需要 特定 GCC 版本
  • 定制 glibc
  • 支持特殊架构(如裸机)

否则 直接用发行版提供的交叉编译器 最稳定。


九、总结(快速命令)

# ARM64
sudo yum install -y gcc-aarch64-linux-gnu g++-aarch64-linux-gnu

# 编译
aarch64-linux-gnu-g++ main.cpp -o main

如果你能告诉我:

  • ✅ 目标 CPU 架构
  • ✅ 目标 Linux 发行版 & glibc 版本
  • ✅ 是否使用 CMake / Makefile

我可以给你 完全定制化的交叉编译方案

0