【Linux学习笔记】初识Linux —— 理解gcc编译器
🌟个人主页:努力学习的小汤
🌈专栏系列:linux

目录
❄️前言:
上一篇博客我们学习了如何使用vim编译器,今天我们来学习一下gcc编译器。
学习了vim编辑器,我们能够在Linux下写代码,那我们如何让代码运行起来呢?
今天我们来学习使用gcc
☀️gcc/g++编译器
现在有这样的一个test.c文件

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

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

简化一下:

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

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 标准编 |
🌻共勉:
以上就是本篇博客的所有内容,如果对你有帮助的话,可以点赞,关注,收藏支持一波~~