0


【Linux从入门到精通|开发工具】---gcc/g++的基本使用

个人主页:平行线也会相交
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创
收录于专栏【Linux专栏】🎈
本专栏旨在分享学习Linux的一点学习心得,欢迎大家在评论区讨论💌
在这里插入图片描述

**接下来我们来学习

Linux编辑器---gcc/g++

的使用。
在学习

gcc/g++

之前,我们先来简单回顾一下之前学过的编译链接的内容。**

1.预处理(去注释、头文件展开、条件编译、宏替换)
2.编译(生成汇编代码)
3.汇编(生成机器可识别代码)
4.链接(生成可执行文件或库文件)

目录

gcc使用过程(图文并茂)🍰

预处理阶段

首先这里这里源文件为

mycode.c

,请看:
在这里插入图片描述
然后输入指令

gcc -E mycode.c -o mycode.i

。编译通过之后就会形成

mycode.i

的一个文件。
这就是我们预处理之后的结果,如下图:

在这里插入图片描述
在这里插入图片描述
我们通过上图可以发现源文件

mycode.c

经过预处理之后由原来的十几行代码变成了800多行代码。为什么会这样呢?这都是从系统当中C语言的头文件中拷贝出来的。

通过上图我们也可以观察到我们原来注释的内容直接被裁剪掉了(去注释),同时发生了宏替换(因为编译器不需要处理已经被我们注释掉的东西)。这里的宏替换要注意,该处的宏替换只是进行了简单的宏替换,并不会做语法检查,因为在编译之前,这里就已经发生宏替换,即已经被替换掉了,并没有机会进行语法检查。
头文件全部拷贝到源文件当中,即当预处理之后其实就不需要头文件了。

**综上,源文件经过预处理(其中包含着

宏替换、去注释、条件编译、头文件展开

)之后代码就会变的比较干净,然后编译器继续对这份干净的代码进行处理,即来到了下一步编译阶段。**

编译阶段(生成汇编)

输入指令:

gcc -S mycode.c -o mycode.s

,即生成了一个

mycode.s

的文件,请看:

在这里插入图片描述
其中,

mycode.s

文件中就存放着

mycode.c

文件经过汇编之后生成的汇编代码,请看:
在这里插入图片描述

汇编阶段(生成机器可识别代码)

在汇编阶段,会把汇编代码转换为机器可识别的代码(即二进制文件)。
输入指令

gcc -c mycode.s -o mycode.o

在这里插入图片描述
我们打开刚刚生成的

mycode.o

文件,里面存放的就是机器可识别代码(看起来像一堆乱码)。请看:
在这里插入图片描述
这里说明一下,vim工具是一个文本编辑器(既然是文本编辑器的话那就只能识别文本啦),而

mycode.o

中存放的是二进制文件,我们用文本编辑器来打开一个二进制文件的话再显示出来,我们看到的就会是一堆乱码。那我们应该如何查看这个二进制文件

mycode.o

呢?我们可以使用二进制查看工具

od

,即输入指令

od mycode.o

。请看:
在这里插入图片描述
到此为止,我们已经就来到了最后一个阶段,即链接阶段。

链接阶段(生成可执行文件或库文件)

输入指令

gcc mycode.o -o mytest

,请看:
在这里插入图片描述
**这里的

mytest

就是一个可执行程序**,我们来运行一个这个可执行程序。
在这里插入图片描述
好了,到此为止,就是一个源文件经过预处理、编译、汇编、链接再到最后运行程序的整个过程。
接下来,我们详细来介绍整个过程中用到的指令。

gcc/g++常用命令选项🎂

**g++和gcc命令选项都是一个用法,所以这个只演示

gcc

的命令选项。**

-o

将文件输出到目标文件。

注意,现在我们又回到了起点,即此时我们只有一个源文件

mycode.c


在这里插入图片描述

gcc mycode.c

这里后面什么选项都不加,回车之后就会直接生成可执行程序

a.out

,请看:
在这里插入图片描述

gcc mycode -o XXX

:让这个可执行程序自己来定义命名。**其中

-o

意思就是后面跟我们想要自定义可执行程序的名称。**
比如

gcc mycode.c -o abc


在这里插入图片描述
其中,

XXX

就是着我们生成的可执行程序。运行结果如下:
在这里插入图片描述
其实我们也可以换一种写法,即

gcc -o mytest mycode.c

。(只要遵循一个原则即可:

-o

后面必须是

可执行程序的名称

)。
请看:
在这里插入图片描述

-E选项

gcc -E mycode.c -o mycode.i

:对源文件进行预处理之后生成

mycode.i

文件。
这里有几个小细节需要我们注意

-E

后面永远跟着我们想要进行预处理操作的文件源,

-o

后面永远跟着最终要生成的目标文件。
如果我们这里的命令不加

-o

(即

gcc -E mycode.c

),这里会默认把输出结果打印到显示器上。这里我们就不进行演示了。
我们要把输出结果打印到文件里,其中

-o

后面生成的目标文件的文件名依然是可以随便取的,但是**由于这里只对源文件

mycode.c

进行预处理操作,所以我们一般把生成的目标文件名取为

mycode.i

。**
下图是最终的演示结果:
在这里插入图片描述

head mycode.i


在这里插入图片描述
**现在来解释

-E

是什么意思:**

-E

的意思就是**告诉

gcc

编译器,从现在开始进行程序的翻译工作,将预处理工作做完之后就停下来不在继续往后走了。**

-S选项

gcc -S mycode.i -o mycode.s

:对预处理之后的

mycode.i

文件进行编译,同时生成

mycode.s

文件。

-o

后面依然是跟着生成的目标文件,文件名依然是随便取,这里是完成的

编译工作

,所以这里建议生成的目标文件的后缀为

.s

,即

mycode.s

。同时这里要注意

gcc -S mycode.i -o mycode.s

是直接从刚刚生成的

.i

文件开始,继续进行程序的翻译工作,将编译工作做完之后停止工作。
其实我们这里可以换一种写法

gcc -S mycode.c -o mycode.s

。即告诉

gcc

编译器,从源文件

.c

开始进行程序的翻译工作,将编译工作做完之后停下来不在进行程序的翻译工作
现在我们来打开一下

mycode.s

文件,请看:
在这里插入图片描述

-c

gcc -c mycode.s -o mycode.o

,其中

-c

的意思就是从现在卡hi是进行程序的翻译工作,将

汇编工作

做完之后,工作停止。
换一种写法的话请看:

gcc -c mycode.c -o mycode.o

,这里是从

.c

源文件开始进行工作直到将

汇编工作

完成。而

gcc -c mycode.s -o mycode.o

是直接从

编译阶段之后生成的.s文件之后

开始工作,直到将

汇编工作

做完之后,工作停止。
所以这里的

-c

就是告诉

gcc编译器

,将程序的汇编工作做完就停止工作。
同时这里要注意:我们把生成的

.o

文件,即

mycode.o

文件称之为

可重定位目标二进制文件

。简称目标文件。其实就是window环境下的可执行文件(

-obj

)。
我们打开

mycode.o

文件打开之后发现是一堆

乱码

。请看:
在这里插入图片描述在这里插入图片描述
我们这里要特别注意,生成的

mycode.o

文件是不可以独立执行的,虽然已经是二进制文件了,需要经过链接才可以执行。
我们来验证一下

mycode.o

确实是不能执行的,请看:
在这里插入图片描述
我们如果赋予

mycode.o

文件可执行权限(

chmod +x mycode.o

)的话,请看:
在这里插入图片描述

可以看到依然是不可以执行的。
**在Linux中,具有可执行

权限

和具有可执行的

能力

是两码事。**
假设我给一个文本文件可执行的权限,最终这个文本文件依然是不可以执行的,因为这个文本文件本身就没有可执行的能力。
所以,这里的

mycode.o

文件(可重定位目标二进制文件)经过链接之后才可以运行。

最后进行链接:

gcc mycode.o -o mytest

:将可重定位目标二进制文件和库进行

链接

形成可执行程序。
在这里插入图片描述
j

总结🥖

本文主要带大家回顾了一下内容:
1.C语言中编译链接的部分知识,总共分为4个阶段(预处理、编译、汇编、链接)。
2.同时演示了

gcc/g++

的几个常用的命令选项(

-E -S -c -o

)。

好了,本文就到这里啦!再见啦友友们!!!
在这里插入图片描述

标签: linux 运维

本文转载自: https://blog.csdn.net/m0_74352571/article/details/131343800
版权归原作者 平行线也会相交 所有, 如有侵权,请联系我们删除。

“【Linux从入门到精通|开发工具】---gcc/g++的基本使用”的评论:

还没有评论