温馨提示×

ubuntu gcc怎样交叉编译

小樊
57
2026-09-22 07:02:28
栏目: 智能运维

在 Ubuntu 上使用 GCC 进行交叉编译,核心思路是:
安装对应平台的交叉编译工具链 → 用交叉编译器代替系统 gcc → 指定目标架构和 sysroot。

下面按常见场景说明。


一、什么是交叉编译

交叉编译是在 x86_64 Ubuntu 上,编译出可在 ARM / RISC-V / MIPS / aarch64 等平台上运行的程序。

例如:

  • 本机:Ubuntu x86_64
  • 目标:ARM32 / ARM64 开发板

二、安装交叉编译工具链(最常见方式)

1️⃣ ARM 32 位(arm-linux-gnueabihf)

sudo apt update
sudo apt install gcc-arm-linux-gnueabihf

使用:

arm-linux-gnueabihf-gcc main.c -o main

2️⃣ ARM 64 位(aarch64-linux-gnu)

sudo apt install gcc-aarch64-linux-gnu

使用:

aarch64-linux-gnu-gcc main.c -o main

3️⃣ RISC-V 64

sudo apt install gcc-riscv64-linux-gnu

使用:

riscv64-linux-gnu-gcc main.c -o main

4️⃣ MIPS

sudo apt install gcc-mips-linux-gnu

三、基本交叉编译示例

C 程序

// hello.c
#include <stdio.h>
int main() {
    printf("Hello Cross Compile\n");
    return 0;
}

编译:

aarch64-linux-gnu-gcc hello.c -o hello

查看架构:

file hello

输出示例:

hello: ELF 64-bit LSB executable, ARM aarch64

四、指定 sysroot(重要)

如果目标程序依赖 目标系统的库(如 glibc),需要 sysroot。

方式一:使用目标系统的根文件系统

aarch64-linux-gnu-gcc \
  --sysroot=/path/to/rootfs \
  hello.c -o hello

方式二:使用 Ubuntu 提供的库

sudo apt install libstdc++-dev-arm64-cross

五、交叉编译 Makefile 示例

CC = aarch64-linux-gnu-gcc
CFLAGS = -Wall

hello: hello.c
	$(CC) $(CFLAGS) hello.c -o hello

使用:

make

六、交叉编译 CMake 项目

1️⃣ 编写工具链文件

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 /path/to/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 -B build -DCMAKE_TOOLCHAIN_FILE=toolchain.cmake
cmake --build build

七、常见问题

❌ 找不到头文件

  • 没指定 --sysroot
  • 没安装 -dev 交叉库

❌ 运行时“not found”

  • 目标板 glibc 版本不一致
  • 动态链接器路径不对

可用静态编译:

aarch64-linux-gnu-gcc -static hello.c -o hello

八、总结

目标平台 编译器
ARM32 arm-linux-gnueabihf-gcc
ARM64 aarch64-linux-gnu-gcc
RISC-V riscv64-linux-gnu-gcc
MIPS mips-linux-gnu-gcc

如果你有 具体目标板型号 / 芯片 / 系统(Buildroot / Yocto / Ubuntu),我可以给你更精确的命令。

0 踩