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

相关推荐
群联云防护小杜8 分钟前
深度隐匿源IP:高防+群联AI云防护防绕过实战
运维·服务器·前端·网络·人工智能·网络协议·tcp/ip
YuTaoShao19 分钟前
【LeetCode 热题 100】994. 腐烂的橘子——BFS
java·linux·算法·leetcode·宽度优先
退役小学生呀22 分钟前
十五、K8s可观测能力:日志收集
linux·云原生·容器·kubernetes·k8s
van叶~23 分钟前
Linux探秘坊-------15.线程概念与控制
linux·运维·服务器
Andy杨2 小时前
20250718-1-Kubernetes 应用程序生命周期管理-应用部署、升级、弹性_笔记
linux·docker·容器
2301_780789664 小时前
UDP和TCP的主要区别是什么
服务器·网络协议·web安全·网络安全·udp
写写闲篇儿6 小时前
Python+MongoDB高效开发组合
linux·python·mongodb
一个龙的传说7 小时前
linux 常用命令
linux·服务器·zookeeper
Ching·9 小时前
esp32使用ESP-IDF在Linux下的升级步骤,和遇到的坑Traceback (most recent call last):,及解决
linux·python·esp32·esp_idf升级