在 Ubuntu 上用 GCC 进行交叉编译,核心就是:安装对应平台的交叉编译工具链,然后用交叉编译器代替系统 gcc。下面按常见场景一步步说明。
交叉编译 = 在一种架构(如 x86_64 Ubuntu)上,编译出另一种架构(如 ARM、RISC-V、MIPS)可运行的程序。
例如:
sudo apt update
sudo apt install gcc-arm-linux-gnueabihf
使用:
arm-linux-gnueabihf-gcc main.c -o main
sudo apt install gcc-aarch64-linux-gnu
使用:
aarch64-linux-gnu-gcc main.c -o main
sudo apt install gcc-riscv64-linux-gnu
使用:
riscv64-linux-gnu-gcc main.c -o main
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
make CC=aarch64-linux-gnu-gcc
或者在 Makefile 中:
CC = aarch64-linux-gnu-gcc
如果程序依赖目标平台的库(如 glibc):
aarch64-linux-gnu-gcc \
--sysroot=/path/to/aarch64-rootfs \
main.c -o main
常见来源:
debootstrap例如 ARM Cortex-M:
sudo apt install gcc-arm-none-eabi
arm-none-eabi-gcc main.c -o main.elf
注意:
.ld)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)
cmake -B build -DCMAKE_TOOLCHAIN_FILE=toolchain-aarch64.cmake
cmake --build build
→ 没设置 --sysroot
not found→ 架构不匹配或动态链接器不对
→ 需要用 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 |
如果你有 具体目标平台(如树莓派、飞腾、龙芯、嵌入式板)或项目类型(内核 / 应用 / 裸机),我可以给你更精确的命令。