文章目录
前言
本文讲解gcc及其选项😙😙🍕🍕🍕
我们首先需要了解这些知识:
背景知识
- 预处理(进行宏替换/去注释/条件编译/头文件展开等)
- 编译(生成汇编)
- 汇编(生成机器可识别代码)
- 连接(生成可执行文件或库⽂件) 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的内容就结束啦,如果对各位有帮助的话,求一个一键三连😘😘😘~~~
版权归原作者 小柯J桑_ 所有, 如有侵权,请联系我们删除。