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

相关推荐
waving-black2 分钟前
利用frp和腾讯云服务器将内网暴露至外网(内网穿透)
linux·服务器·腾讯云·frp·内网穿透
stormsha14 分钟前
Linux中su与sudo命令的区别:权限管理的关键差异解析
linux·运维·服务器·鸿蒙系统·ux·batch命令
吾日三省吾码1 小时前
Spring 团队详解:AOT 缓存实践、JSpecify 空指针安全与支持策略升级
java·spring·缓存
筏.k1 小时前
grep、wc 与管道符快速上手指南
linux
Johny_Zhao1 小时前
华为MAAS、阿里云PAI、亚马逊AWS SageMaker、微软Azure ML各大模型深度分析对比
linux·人工智能·ai·信息安全·云计算·系统运维
CodeOfCC1 小时前
c语言 封装跨平台线程头文件
linux·c语言·windows
科文小白狼1 小时前
Linux下VSCode开发环境配置(LSP)
linux·vscode·里氏替换原则·lsp
jugt3 小时前
CentOS 7.9安装Nginx1.24.0时报 checking for LuaJIT 2.x ... not found
linux·运维·centos
多多*4 小时前
LUA+Reids实现库存秒杀预扣减 记录流水 以及自己的思考
linux·开发语言·redis·python·bootstrap·lua
何双新5 小时前
第21讲、Odoo 18 配置机制详解
linux·python·开源