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

评论 58
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值