深入了解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

相关推荐
树℡独3 小时前
ns-3仿真之应用层(五)
服务器·网络·tcp/ip·ns3
嵩山小老虎3 小时前
Windows 10/11 安装 WSL2 并配置 VSCode 开发环境(C 语言 / Linux API 适用)
linux·windows·vscode
Fleshy数模4 小时前
CentOS7 安装配置 MySQL5.7 完整教程(本地虚拟机学习版)
linux·mysql·centos
a41324474 小时前
ubuntu 25 安装vllm
linux·服务器·ubuntu·vllm
Configure-Handler4 小时前
buildroot System configuration
java·服务器·数据库
津津有味道4 小时前
易语言TCP服务端接收刷卡数据并向客户端读卡器发送指令
服务器·网络协议·tcp·易语言
Fᴏʀ ʏ꯭ᴏ꯭ᴜ꯭.5 小时前
Keepalived VIP迁移邮件告警配置指南
运维·服务器·笔记
Genie cloud5 小时前
1Panel SSL证书申请完整教程
服务器·网络协议·云计算·ssl
一只自律的鸡5 小时前
【Linux驱动】bug处理 ens33找不到IP
linux·运维·bug
17(无规则自律)6 小时前
【CSAPP 读书笔记】第二章:信息的表示和处理
linux·嵌入式硬件·考研·高考