深入了解Linux —— 理解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要检查代码规范性、是否存在语法错误,并且确定代码实际的操作;检查无误后将代码翻译成汇编语言。

复制代码
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:尽量使用动态库,生成文件较小,需要系统存在动态库
  • O0O1O2O3:编译器优化的三个选项,-O0没有优化、O1是缺省值、O3优化级别最高。
  • -w:不生成任何警告信息
  • -Wall:生成所有警告信息

到这里,gcc就结束了;有部分细节内容可以深入学习。

我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=2oul0hvapjsws

相关推荐
ITHAOGE153 分钟前
下载 | Windows Server 2025官方原版ISO映像!(4月更新、标准版、数据中心版、26100.32690)
服务器·windows·科技·微软·电脑
zhangrelay4 分钟前
三分钟云课实践速通--模拟电子技术-模电--SimulIDE
linux·笔记·学习·ubuntu·lubuntu
木木_王10 分钟前
嵌入式Linux学习 | 数据结构 (Day05) 栈与队列详解(原理 + C 语言实现 + 实战实验 + 易错点剖析)
linux·c语言·开发语言·数据结构·笔记·学习
Ether IC Verifier28 分钟前
OSI网络七层协议详细介绍
服务器·网络·网络协议·计算机网络·php·dpu
Joseph Cooper35 分钟前
Linux Power Management 子系统:从 suspend/resume 到 Runtime PM、PM QoS
linux·驱动开发·linux kernel·嵌入式linux·电源管理
快乐非自愿1 小时前
Redis--SDS字符串与集合的底层实现原理
数据库·redis·缓存
wj3055853781 小时前
CC-Switch 在 WSL Ubuntu 中安装记录
linux·运维·ubuntu
_守一1 小时前
UE DS+Nakama进行游戏服务器开发(1)源码编译nakama
服务器·游戏
Joseph Cooper1 小时前
Linux HID 子系统实战:从虚拟键盘到 input 事件上报
linux·c语言·计算机外设
原来是猿1 小时前
【Socket编程预备知识】
linux·运维·服务器·网络