【Linux学习笔记】初识Linux —— 理解gcc编译器

🌟个人主页:努力学习的小汤****

🌈专栏系列:linux****

目录

❄️前言:

☀️gcc/g++编译器

☀️编译-链接

[⭐1. 预处理](#⭐1. 预处理)

[⭐2. 编译](#⭐2. 编译)

[⭐3. 汇编](#⭐3. 汇编)

[⭐4. 链接](#⭐4. 链接)

☀️动静态库

⭐静态库

⭐动态库

☀️gcc选项

☀️本章小结:

🌻共勉:


❄️前言:

上一篇博客我们学习了如何使用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 标准编

🌻共勉:

以上就是本篇博客的所有内容,如果对你有帮助的话,可以点赞,关注,收藏支持一波~~


相关推荐
Mintopia33 分钟前
OpenClaw 对软件行业产生的影响
人工智能
陈广亮1 小时前
构建具有长期记忆的 AI Agent:从设计模式到生产实践
人工智能
会写代码的柯基犬1 小时前
DeepSeek vs Kimi vs Qwen —— AI 生成俄罗斯方块代码效果横评
人工智能·llm
Mintopia2 小时前
OpenClaw 是什么?为什么节后热度如此之高?
人工智能
爱可生开源社区2 小时前
DBA 的未来?八位行业先锋的年度圆桌讨论
人工智能·dba
chlk1234 小时前
Linux文件权限完全图解:读懂 ls -l 和 chmod 755 背后的秘密
linux·操作系统
舒一笑4 小时前
Ubuntu系统安装CodeX出现问题
linux·后端
叁两5 小时前
用opencode打造全自动公众号写作流水线,AI 代笔太香了!
前端·人工智能·agent
改一下配置文件5 小时前
Ubuntu24.04安装NVIDIA驱动完整指南(含Secure Boot解决方案)
linux