🌟个人主页:努力学习的小汤****
🌈专栏系列:linux****


目录
[⭐1. 预处理](#⭐1. 预处理)
[⭐2. 编译](#⭐2. 编译)
[⭐3. 汇编](#⭐3. 汇编)
[⭐4. 链接](#⭐4. 链接)
❄️前言:
上一篇博客我们学习了如何使用vim编译器,今天我们来学习一下gcc编译器。
学习了vim编辑器,我们能够在Linux下写代码,那我们如何让代码运行起来呢?
今天我们来学习使用gcc
☀️gcc/g++编译器
现在有这样的一个test.c文件

我们使用gcc对它进行编译,形成可执行程序(默认形成a.out)

☀️编译-链接
在
C语言学习中,简单的学习过编译和链接,当时也使用了gcc形成中间临时文件;现在再来看一下,文件编译链接的过程

简化一下:

这里再简单描述一下,描述一下gcc选项及其功能。
⭐1. 预处理
预处理主包括宏定义、文件包含、语法编译、去注释等。
预处理指令以#开头
gcc -E code.c -o code.i
-E:让gcc编译器在预处理结束后就停止
-o:指模板文件,.i文件是已经预处理过的C原始程序
⭐2. 编译
编译阶段,gcc要检查代码规范性、是否存在语法错误,并且确定代码实际的操作;检查无误后将代码翻译成汇编语言。
bash
gcc -S code.i -o code.s
-S:只进行编译而不进行汇编,生成汇编代码。
⭐3. 汇编
汇编就是将编译生成的汇编代码.s文件,转化为目标文件。
cpp
gcc -c code.s -o code.o
在此时生成的
-o文件就是一个二进制目标文件了;但是不是可执行程序,还需要进行链接
⭐4. 链接
bash
gcc code.c -o code
在链接时,可以动态链接,也可以静态链接(gcc默认是动态链接)静态链接需要带选项-static
动态链接:
bash
ldd 可执行程序(动态链接)
用来查看程序所依赖的动态链接库信息

bash
file 文件
可以用来查看文件类型

静态链接:
gcc默认动态链接,静态链接需要带上-static选项静态链接就是将库内容拷贝到文件中。(这里不演示了)
链接完成以后就形成了真正可以执行的可执行程序。

链接,这里就涉及到动静态库这个概念。
☀️动静态库
⭐静态库
所谓静态库,就是在编译链接时,将库文件的所有内容拷贝到可执行程序中,生成的文件都比较大,在运行时不需要库文件了;
.a是其后缀名。
⭐动态库
动态库就并没有在编译链接时将库文件拷贝到可执行程序中;而是在程序运行时由运行时链接文件加载到库,这样就节省系统的开销。
一般后缀名是
.so。在上文
ldd查看动态链接库中lib.so.6就是动态库
gcc默认使用动态库。
☀️gcc选项
-E:只进行预处理,不生成文件,需要重定向到一个文件中。(-o)
-S:编译到汇编语言,不进行汇编和链接操作
-c:编译到目标代码,不进行链接操作
-o:输出到目标文件
-static:对生成文件采用静态链接
-g:生成调试信息,GNU调试器可以利用此信息
-shared:尽量使用动态库,生成文件较小,需要系统存在动态库
O0、O1、O2、O3:编译器优化的三个选项,-O0没有优化、O1是缺省值、O3优化级别最高。
-w:不生成任何警告信息
-Wall:生成所有警告信息
☀️本章小结:
| 模块 | 核心知识点 | 具体操作 / 指令 | 补充说明 |
|---|---|---|---|
| GCC 基础编译 | 默认编译 | gcc test.c |
直接生成默认名为a.out的可执行程序 |
| 指定输出文件名 | gcc test.c -o test |
将编译结果输出为test可执行文件,便于区分 |
|
| GCC 编译四阶段 | 预处理 | gcc -E test.c -o test.i |
核心操作:宏定义展开、文件包含、删除注释、处理预处理指令(# 开头)生成.i预处理文件 |
| 编译 | gcc -S test.i -o test.s |
核心操作:检查语法规范性、无错误后将代码转为汇编语言生成.s汇编文件 |
|
| 汇编 | gcc -c test.s -o test.o |
核心操作:将汇编代码转为二进制目标文件生成.o目标文件(不可直接执行) |
|
| 链接 | gcc test.o -o test |
核心操作:将目标文件与系统库关联,生成可执行程序 | |
| 动静态链接 | 动态链接(默认) | gcc test.c -o test |
编译生成的程序运行时依赖系统动态库,体积小 |
| 静态链接 | gcc test.c -o test_static -static |
编译时将库代码嵌入程序,生成的程序可独立运行,体积大 | |
| 动静态库验证 | 查看动态链接依赖 | ldd 可执行程序名 |
例:ldd test,可列出程序依赖的所有动态库 |
| 查看文件属性 | file 可执行程序名 |
例:file test,可区分程序是动态 / 静态链接生成 |
|
| GCC 常用选项 | 预处理输出 | -E |
仅执行预处理,输出预处理后的代码(常配合-o指定.i文件) |
| 编译输出汇编 | -S |
预处理 + 编译,输出汇编代码(常配合-o指定.s文件) |
|
| 汇编输出目标文件 | -c |
预处理 + 编译 + 汇编,输出目标文件(常配合-o指定.o文件) |
|
| 指定输出文件名 | -o |
自定义编译 / 链接后的文件名称,例:-o test |
|
| 静态链接 | -static |
强制使用静态库链接,生成不依赖动态库的可执行程序 | |
| 显示警告信息 | -Wall |
显示所有编译警告(建议开发时添加,排查潜在问题) | |
| 指定 C 语言标准 | -std=c99/-std=c11 |
例:gcc test.c -o test -std=c99,指定按 C99 标准编 |
🌻共勉:
以上就是本篇博客的所有内容,如果对你有帮助的话,可以点赞,关注,收藏支持一波~~
