Bootstrap

【Linux】超详细介绍gcc/g++以及程序翻译过程

目录

一、快速认识一下gcc/g++

二、程序的翻译过程

1、预处理:-E选项

分为一以下四步:

(1)、通过指令查看预处理结果:-E选项

(2)、为什么#ifndef、#define、#endif 可以防止头文件被重复包含?

2、编译:-S选项

(1)、通过指令查看编译结果:-S选项

3、汇编:-c选项

(1)、通过指令查看汇编结果:-c 选项

4、链接:-o选项

1、-o选项

2、查看 可执行文件所链接/依赖的库:ldd + 可执行文件名

3.为什么linux可以直接运行C语言?


一、快速认识一下gcc/g++

可以用来编译链接.c文件,使之生成可执行文件。

其中 -o 选项是用来重命名为“my.exe”;

注意:

(1)、C语言既可以使用gcc也可以使用g++;

(2)、C++只能使用g++;

(3)、gcc和g++的使用方法是完全相同的,所以以讲解gcc为主;

二、程序的翻译过程

会经历以下四步:C语言为例

1、预处理:-E选项

分为一以下四步:

(1)、 头文件展开:

所谓头文件展开,本质是预处理的时候,将头文件的内容拷贝到源文件。

(2) 、去注释:即把注释给去掉

(3)、宏替换:在编译之前将对应的宏标识符替换为对应的宏定义内容。

(4)、条件编译:

我们可以通过给编译器传递不同的宏值,来进行对代码的动态裁剪

条件编译应用:

各种软件的专业版和社区版就是使用同一套源代码,只是社区版是通过条件编译将某些功能给去掉了,所以专业版功能会更多。如下:

若源代码中有某些ifndef指令的话,就可以通过条件编译打印出不同的内容。

(1)、通过指令查看预处理结果:-E选项

-E 选项:表示从现在开始进行程序翻译的过程,当预处理做完就停下来。

(1)、使用 -o 选项将生成的数据放到 .i 文件中(若不使用-o选项,就会将结果打印到终端上)

(2)、.i 文件通常称为预处理文件,里面是预处理四个步骤后所产生的结果。

注意:预处理后的代码还是C语言:

(2)、为什么#ifndef、#define、#endif 可以防止头文件被重复包含?

这也是条件编译的应用场景之一:

我们知道在预处理阶段,头文件是会被展开的,第一次条件检查检测该宏有没有被定义,如果没有定义就会进行定义,如果第二次又包含了该头文件,就会再展开,再条件检测,发现该宏已经被定义过了,就不会在使用该头文件里面的内容了。

2、编译:-S选项

C语言——>汇编:将C语言翻译成汇编语言。

(1)、通过指令查看编译结果:-S选项

通过 -S 选项对预处理文件(.i 文件)进行处理,会生成 .s 文件,.s 文件称为汇编语言源文件,即使不用 -o 选项指定名字,也会自动在同级目录生成同名.s文件,.s文件里面内容就是由C语言转换而来的汇编语言:

3、汇编:-c选项

汇编语言——>二进制语言(可重定位目标二进制文件,但不能执行)

将汇编语言翻译成二进制语言。

(1)、通过指令查看汇编结果:-c 选项

(1)、通过 -c 选项就就可以执行汇编过程,会生成 .o 文件(即使不使用 -o 选项,也会生成同名.o文件)。

(2)、 .o 文件称为可重定位目标二进制文件,里面放的全是二进制数据:因为linux终端是是用于显示文本内容,所以查看二进制数据时会显示乱码。

注意 .o 文件是不能被执行的( ./ ):

4、链接:-o选项

1、-o选项

(1)、通过-o选项进行链接操作,生成就是可执行文件。

(2)、注意 -o 选项一定要指定生成的文件名:

(3)、生成的文件就可以执行了:

2、查看 可执行文件所链接/依赖的库:ldd + 可执行文件名

(1)、首先我们要知道库分为动态库和静态库,后缀名分别如下:

(2)、ldd指令:

3.为什么linux可以直接运行C语言?

平台要支持开发,就必须要提前字系统中安装各种语言的标准头文件+库文件。

如下是linux中安装的C语言头文件:

这就是为什么linux可以直接运行C语言。

;