在 Ubuntu 上使用 GCC 进行交叉编译,核心思路是:
安装对应平台的交叉编译工具链 → 用交叉编译器代替系统 gcc → 指定目标架构和 sysroot。
下面按常见场景说明。
交叉编译是在 x86_64 Ubuntu 上,编译出可在 ARM / RISC-V / MIPS / aarch64 等平台上运行的程序。
例如:
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
// 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
如果目标程序依赖 目标系统的库(如 glibc),需要 sysroot。
aarch64-linux-gnu-gcc \
--sysroot=/path/to/rootfs \
hello.c -o hello
sudo apt install libstdc++-dev-arm64-cross
CC = aarch64-linux-gnu-gcc
CFLAGS = -Wall
hello: hello.c
$(CC) $(CFLAGS) hello.c -o hello
使用:
make
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)
cmake -B build -DCMAKE_TOOLCHAIN_FILE=toolchain.cmake
cmake --build build
--sysroot-dev 交叉库可用静态编译:
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),我可以给你更精确的命令。