温馨提示×

ubuntu gcc怎么交叉编译

小樊
47
2026-09-19 05:06:41
栏目: 智能运维

在 Ubuntu 上用 GCC 进行交叉编译,核心就是:安装对应平台的交叉编译工具链,然后用交叉编译器代替系统 gcc。下面按常见场景一步步说明。


一、什么是交叉编译

交叉编译 = 在一种架构(如 x86_64 Ubuntu)上,编译出另一种架构(如 ARM、RISC-V、MIPS)可运行的程序

例如:

  • x86_64 Ubuntu → 编译 ARM 程序
  • x86_64 Ubuntu → 编译 aarch64 程序

二、安装交叉编译工具链(常见架构)

1️⃣ ARM(32 位)

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

使用:

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

2️⃣ AArch64(ARM64)

sudo apt install gcc-aarch64-linux-gnu

使用:

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

3️⃣ RISC-V

sudo apt install gcc-riscv64-linux-gnu

使用:

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

4️⃣ MIPS

sudo apt install gcc-mips-linux-gnu

使用:

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

三、验证交叉编译器

aarch64-linux-gnu-gcc --version
file main

file 输出应类似:

main: ELF 64-bit LSB executable, ARM aarch64

四、编译带 Makefile 的项目

make CC=aarch64-linux-gnu-gcc

或者在 Makefile 中:

CC = aarch64-linux-gnu-gcc

五、指定 sysroot(需要目标系统库时)

如果程序依赖目标平台的库(如 glibc):

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

常见来源:

  • 官方发行版 rootfs
  • debootstrap
  • 开发板 SDK

六、裸机(无操作系统)交叉编译

例如 ARM Cortex-M:

sudo apt install gcc-arm-none-eabi
arm-none-eabi-gcc main.c -o main.elf

注意:

  • 无 Linux 系统调用
  • 需要链接脚本(.ld

七、CMake 交叉编译(推荐)

1️⃣ 写 toolchain 文件

toolchain-aarch64.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_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-aarch64.cmake
cmake --build build

八、常见问题

❌ 找不到头文件 / 库

→ 没设置 --sysroot

❌ 运行提示 not found

→ 架构不匹配或动态链接器不对

❌ 在 x86 上直接运行

→ 需要用 qemu

qemu-aarch64 ./main

九、总结

目标架构 编译器前缀
ARM32 arm-linux-gnueabihf-gcc
ARM64 aarch64-linux-gnu-gcc
RISC-V riscv64-linux-gnu-gcc
MIPS mips-linux-gnu-gcc
裸机 ARM arm-none-eabi-gcc

如果你有 具体目标平台(如树莓派、飞腾、龙芯、嵌入式板)或项目类型(内核 / 应用 / 裸机),我可以给你更精确的命令。

0