前言
本文是关于gcc编译器的知识点。
记录嵌入式学习过程,持续更新。。。
gcc
gcc是一个跨平台的编译器,将我们的高级编程语言的代码编译成计算机认识的机器码二进制可执行的程序。
gcc创始人是理查德·斯托曼(也是GUN的发起人)
编译生成指定文件名
gcc demo.c 生成默认的 a.out
修改产物名称用 -o
gcc -o demo demo.c 直接编译生成demo可执行程序
gcc demo.c -o demo 先生成a.out文件再改名为demo、
gcc编译步骤(重点)
预处理 ——编译——汇编——链接
预处理
(1)将头文件的内容原封不动的复制过来一份; #include <stdio.h>等
(2)将程序中所有的宏定义进行无脑的替换;
(3)将程序中所有的注释删除掉。
gcc -E -o demo.i demo.c
-E 让编译过程停留在预处理阶段
demo.i 预处理阶段的产物后缀是 .i
编译
将源程序编译生成汇编程序
gcc -S -o demo.s demo.c
-S 将编译步骤停留在编译阶段
demo.s 编译阶段的产物后缀是 .s (汇编程序也是 .s)
汇编
将汇编程序代码编译生成计算机能识别的二进制机器码
-c 将编译步骤停留在汇编阶段
gcc -c -o demo.o demo.c 汇编阶段的产物后缀是 .o
gcc -c demo.c 直接默认生成的产物就叫demo.o
链接
将多个 .o文件和库文件链接在一起生成最终可执行程序
gcc -o demo demo.c 利用源程序生成可执行的产物demo
gcc -o demo demo.o 利用上一步产物基础上继续进行编译,生成可执行的二进制文件
gcc编译多个文件
因为分多个文件,所以引入 extern关键字
extern关键字:提前告诉编译器,函数或者全局变量定义在其他文件中
一步编译,生成产物(略)
逐个编译为 .o,再生成产物,如图片过程
gcc编译优化
gcc可对我们的代码进行优化处理,用 -O 分为三个等级 -O1 -O2 -O3
gcc -O2 -o demo demo.c
额外知识点
gcc demo.c -Wall 显示所有警告信息 -Wall
gcc demo.c -w 忽略所有警告信息 -w