0


落叶与纷飞: 探索Linux下 GCC编译的秘密

在这里插入图片描述

文章目录


前言

本文讲解gcc及其选项😙😙🍕🍕🍕
我们首先需要了解这些知识:
背景知识

  1. 预处理(进行宏替换/去注释/条件编译/头文件展开等)
  2. 编译(生成汇编)
  3. 汇编(生成机器可识别代码)
  4. 连接(生成可执行文件或库⽂件) gcc编译选项 格式 gcc [选项] 要编译的⽂件 [选项] [目标⽂件]

在这里插入图片描述
接下来我们来具体进行讲解:


GCC 编译流程详解

格式:

gcc [选项] 要编译的文件 [选项] [目标文件]

如果直接gcc 目标文件,就会直接生成a.out运行文件

在这里插入图片描述
在这里插入图片描述


1. 预处理 (进行宏替换)

预处理功能主要包括宏定义、文件包含、条件编译、去注释等。所有预处理指令以

#

开头。

  • 实例: gcc -E hello.c -o hello.i- 选项 -E: 让 gcc 在预处理结束后停止编译。- 选项 -o: 指定输出文件。.i 文件为预处理后的 C 原始程序。

从现在开始,开始程序的翻译,一旦预处理结束,就停下来

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


2. 编译 (生成汇编代码)

在此阶段,

gcc

首先检查代码的规范性和语法,然后将代码翻译成汇编语言。

  • 实例: gcc -S hello.i -o hello.s- 选项 -S: 只编译到汇编代码,不进行汇编。

从现在开始进行程序的翻译,编译做完形成汇编,就停下来

在这里插入图片描述

在这里插入图片描述


3. 汇编 (生成机器码)

汇编阶段将编译阶段生成的

.s

文件转成目标文件。

  • 实例: gcc -c hello.s -o hello.o- 选项 -c: 只汇编到目标代码 .o 文件,不进行链接。

开始进行程序的翻译,汇编结束就停下来,形成可重定位目标二进制文件,不可执行

在这里插入图片描述

在这里插入图片描述


4. 连接 (生成可执行文件或库文件)

在成功编译后进入链接阶段,将

.o

文件链接成可执行文件或库文件。

  • 实例: gcc hello.o -o hello- printf 函数实现位于动态库 libc.so.6 中,gcc 会在默认路径 /usr/lib 查找。

我们的.o文件和库文件进行连接,形成可执行文件

在这里插入图片描述

在这里插入图片描述

函数库类型

  • 静态库: 编译时将库代码加入可执行文件中,文件较大但独立运行。后缀 .a
  • 动态库: 在运行时加载库文件,节省空间。后缀 .so,如 libc.so.6

常用 GCC 选项

选项功能说明

-E

只激活预处理,不生成文件,需重定向输出。

-S

只编译到汇编代码,不进行汇编和链接。

-c

生成目标代码。

-o

指定输出文件。

-static

使用静态链接。

-g

生成调试信息。

-shared

使用动态链接,文件较小,依赖动态库。

-O0/-O1/-O2/-O3

编译器优化级别,

-O0

无优化,

-O3

最高优化。

-w

不生成警告信息。

-Wall

生成所有警告信息。

记忆小技巧
  • ESc: -E (预处理),-S (编译到汇编),-c (生成目标代码)

退出键:只有c是小写

  • iso: -i (预处理),-s (编译到汇编),-o (生成目标代码)

总结

到这里gcc的内容就结束啦,如果对各位有帮助的话,求一个一键三连😘😘😘~~~

在这里插入图片描述

标签: linux 运维 gcc编译

本文转载自: https://blog.csdn.net/Jdxxwu/article/details/143482849
版权归原作者 小柯J桑_ 所有, 如有侵权,请联系我们删除。

“落叶与纷飞: 探索Linux下 GCC编译的秘密”的评论:

还没有评论