温馨提示×

c++在linux怎么交叉编译

小樊
33
2026-10-11 00:26:35
栏目: 编程语言

在 Linux 下做 C++ 交叉编译,核心思路是:
用“host(开发机)”上的编译器,生成“target(目标机)”上可运行的程序。

下面按「概念 → 步骤 → 示例 → 常见问题」来讲。


一、基本概念

名称 含义
Host 你写代码、编译的机器(如 x86_64 Ubuntu)
Target 程序最终运行的机器(如 ARM、RISC-V、MIPS)
交叉编译器 如 arm-linux-gnueabihf-g++

二、一般步骤

1️⃣ 安装交叉编译工具链

常见目标平台示例

ARM 32 位(软浮点/硬浮点)

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

RISC-V

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

2️⃣ 写一个简单的 C++ 程序

hello.cpp

#include <iostream>
int main() {
    std::cout << "Hello Cross Compile\n";
}

3️⃣ 使用交叉编译器编译

ARM 32 位

arm-linux-gnueabihf-g++ hello.cpp -o hello_arm

ARM 64 位

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

4️⃣ 检查编译结果

file hello_arm

输出类似:

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

5️⃣ 拷贝到目标设备运行

scp hello_arm user@arm-board:/tmp
ssh user@arm-board
/tmp/hello_arm

三、使用 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
  • 嵌入式 SDK 通常会提供
--sysroot=/path/to/target/sysroot

❓ 运行时报 “not found”

  • 目标机缺少动态库
  • 用:
ldd hello_arm

查看依赖


❓ 想静态编译

arm-linux-gnueabihf-g++ main.cpp -static -o app

五、典型应用场景

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


如果你告诉我:

  • 目标平台(ARM?RISC-V?)
  • 是否用 CMake
  • 是否是嵌入式 SDK

我可以直接给你可复制的完整命令。

0 踩