温馨提示×

linux c++配置如何交叉编译

小樊
56
2026-09-02 02:31:53
栏目: 编程语言

在 Linux 下进行 C++ 交叉编译(Cross Compilation),核心思想是:
在 x86_64 的主机(Host)上,编译出能在目标平台(Target,如 ARM、MIPS、RISC‑V)上运行的程序

下面按「原理 → 工具链 → 配置方式 → 示例 → 常见坑」系统说明。


一、交叉编译基本原理

普通编译:

源码 -> 本机编译器 -> 本机可执行文件

交叉编译:

源码 -> 交叉编译器(如 arm-linux-gnueabihf-g++)-> 目标平台可执行文件

关键点:

  • 编译器前缀不同(如 arm-linux-gnueabihf-g++
  • 头文件和库来自 目标系统的 sysroot
  • 不能在主机上直接运行生成的可执行文件

二、安装交叉编译工具链

1. Ubuntu / Debian(最常见)

ARM 32 位(armhf)

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

MIPS

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

验证:

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

2. 使用厂商工具链(嵌入式常见)

例如:

  • ARM 官方arm-none-linux-gnueabihf
  • Linaro
  • Buildroot / Yocto 生成的交叉工具链

示例:

export CROSS_COMPILE=~/toolchain/bin/arm-linux-gnueabihf-

三、最小 C++ 交叉编译示例

1. 源码

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

2. 编译(ARM 32)

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

3. 检查

file main_arm

输出应类似:

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

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

1. 编写工具链文件

toolchain-arm.cmake

set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)

set(CROSS_COMPILE arm-linux-gnueabihf-)

set(CMAKE_C_COMPILER   ${CROSS_COMPILE}gcc)
set(CMAKE_CXX_COMPILER ${CROSS_COMPILE}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

五、链接目标平台库(sysroot)

如果程序依赖:

  • OpenSSL
  • Boost
  • 第三方 SDK

必须指定目标平台的 sysroot:

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

CMake 示例:

set(CMAKE_SYSROOT /opt/target/sysroot)

或:

arm-linux-gnueabihf-g++ main.cpp \
  --sysroot=/opt/target/sysroot \
  -I/opt/target/sysroot/usr/include \
  -L/opt/target/sysroot/usr/lib

六、Makefile 示例

CXX = arm-linux-gnueabihf-g++
CXXFLAGS = -Wall

main: main.cpp
	$(CXX) $(CXXFLAGS) main.cpp -o main

clean:
	rm -f main

七、常见错误与解决方法

1. cannot execute binary file

✅ 你在主机上运行了 ARM 程序
✅ 必须在目标板或 QEMU 中运行

2. 找不到头文件 / 库

✅ 使用了主机 /usr/include ✅ 必须指定 --sysroot

3. 链接到主机 libc

✅ 编译器和 sysroot 不匹配 ✅ 确认工具链与目标系统一致


八、调试与运行方式

QEMU 用户态

qemu-arm ./main_arm

真实板子

scp main_arm board:/tmp
ssh board ./main_arm

九、总结一句话

Linux C++ 交叉编译 = 正确的交叉编译器 + 正确的 sysroot + 正确的 CMake/Makefile 配置

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

  • 目标平台(ARM / RISC‑V / MIPS)
  • 是否用 CMake / Makefile
  • 是否依赖第三方库

我可以给你 完全可复制的配置示例

0