Linux 交叉编译
在嵌入式开发或多平台开发中,你经常会遇到一个问题:你在 PC 上写好代码,但目标设备的 CPU 架构(比如 ARM、MIPS)和操作系统环境与开发机不一样,这时你就不能直接用 gcc 编译后运行。这时,交叉编译(Cross Compilation)就派上用场了。
本文将带你从零了解 Linux 下的交叉编译,包括:
- 什么是交叉编译,为什么要用它?
- 交叉编译器的工作原理;
- 如何获取交叉工具链;
- 一个实际的 C 程序交叉编译示例;
- 使用 CMake、Make 的交叉编译配置方法。
什么是交叉编译?
简单来说,交叉编译是指在一个平台(如 x86 架构的 Ubuntu PC)上编译出能在另一个平台(如 ARM 架构的开发板)运行的程序。
这时候你使用的编译器就不是默认的 gcc
,而是一个能生成 ARM 可执行文件的交叉编译器,例如:
arm-linux-gnueabihf-gcc
aarch64-linux-gnu-gcc
你可能会看到这些术语:
- 主机(Host):你运行编译器的那台机器(例如 x86 的 Linux PC)。
- 目标(Target):你希望最终程序运行的设备(如 ARM 的开发板)。
- 构建(Build):构建工具实际运行的平台(一般与 Host 相同)。
交叉编译器的原理
交叉编译器是一种特殊的编译器,它的作用是:在主机平台生成目标平台的可执行程序。
它内部包含了一套为目标架构构建的:
- 编译器(gcc、g++);
- 汇编器(as);
- 链接器(ld);
- 标准库(如
libc
,libstdc++
,libm
等); - 系统头文件(如
unistd.h
,stdio.h
等)。
这些工具通常被打包成一个工具链(toolchain),可以直接使用或下载。