【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 标准编

🌻共勉:

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


相关推荐
格林威6 小时前
Baumer相机水果表皮瘀伤识别:实现无损品质分级的 7 个核心方法,附 OpenCV+Halcon 实战代码!
人工智能·opencv·计算机视觉·视觉检测·工业相机·sdk开发·堡盟相机
rainbow7242446 小时前
AI证书选型深度分析:如何根据职业目标评估其真正价值
人工智能·机器学习
AI科技星6 小时前
从ZUFT光速螺旋运动求导推出自然常数e
服务器·人工智能·线性代数·算法·矩阵
love530love6 小时前
Windows 下 GCC 编译器安装与排错实录
人工智能·windows·python·gcc·msys2·gtk·msys2 mingw 64
倔强的石头1066 小时前
归纳偏好 —— 机器学习的 “择偶标准”
人工智能·机器学习
zhangshuang-peta6 小时前
通过MCP实现安全的多渠道人工智能集成
人工智能·ai agent·mcp·peta
迎仔6 小时前
A-总览:GPU驱动运维系列总览
linux·运维
听麟6 小时前
HarmonyOS 6.0+ APP AR文旅导览系统开发实战:空间定位与文物交互落地
人工智能·深度学习·华为·ar·wpf·harmonyos
学编程的闹钟6 小时前
99【html与php的混写】
学习