首页 理论教育 GCC编译分析-零点起步

GCC编译分析-零点起步

时间:2023-10-31 理论教育 版权反馈
【摘要】:在使用GCC编译器时,必须给出一系列必要的选项和文件名。GCC最基本的命令格式为其中options就是编译器所需要的选项。通过指定不同的选项,GCC可以实现其强大的功能。GCC的编译流程说明。根据上面的内容,使用GCC命令来编译该程序。编译器在预处理结束后,GCC首先要检查代码的规范性和是否有语法错误等,以确定代码实际要做的工作。可见,GCC已经将其转化为汇编了。

GCC编译分析-零点起步

在使用GCC编译器时,必须给出一系列必要的选项和文件名。GCC最基本的命令格式为

978-7-111-33316-6-Chapter05-2.jpg

其中options就是编译器所需要的选项。通过指定不同的选项,GCC可以实现其强大的功能。filenames给出了相关的文件名,GCC会根据用户所指定的编译选项以及所识别的文件后缀名来对编译文件进行相应的处理。

【例5-1】GCC的编译流程说明。

下面通过例子来实践GCC的编译流程。

设计步骤

1)在Vim中创建一个新工程文件,命名为“example5_1.c”。

2)在“example5_1.c”中创建如下代码。

978-7-111-33316-6-Chapter05-3.jpg

978-7-111-33316-6-Chapter05-4.jpg

根据上面的内容,使用GCC命令来编译该程序。首先进行预处理,然后进行编译、汇编和链接。

3)预处理阶段。

预处理(Preprocess)阶段输入的是C语言的源文件,编译器分析处理源代码文件中的各种宏指令,如#include和#ifdef等,进行去注释、头文件展开和宏替换等操作。在预处理阶段,编译器将上述代码中的stdio.h编译进来,用户可以调用-E参数让GCC在预处理结束后停止编译过程。

978-7-111-33316-6-Chapter05-5.jpg

此处的“-o”是指目标文件,“.i”为经过预处理的C源程序。以下为example5_1.i文件的部分内容。

978-7-111-33316-6-Chapter05-6.jpg

978-7-111-33316-6-Chapter05-7.jpg

4)编译阶段。

编译(Compile)是指从高级语言转换成汇编语言的过程。编译器在预处理结束后,GCC首先要检查代码的规范性和是否有语法错误等,以确定代码实际要做的工作。在检查无误后,就开始把代码翻译成汇编语言。GCC的选项“-S”能使编译器在进行完汇编之前就停止,该选项只进行编译而不进行汇编,生成汇编代码。由表5-1可知,“.s”是汇编语言原始程序,因此该处的目标文件可设为“.s”类型。

978-7-111-33316-6-Chapter05-8.jpg

以下列出了example5_1.s的内容。可见,GCC已经将其转化为汇编了。

978-7-111-33316-6-Chapter05-9.jpg

978-7-111-33316-6-Chapter05-10.jpg

978-7-111-33316-6-Chapter05-11.jpg

可以看到,这一小段C语言的程序在汇编中已经复杂很多了,这也是C语言的优势所在。

5)汇编阶段。(www.xing528.com)

汇编(Assemble)阶段是把编译阶段生成的“.s”文件生成目标文件,读者在此使用选项“-c”就可看到汇编代码已转化为“.o”的二进制目标代码了。如下所示:

978-7-111-33316-6-Chapter05-12.jpg

6)链接阶段。

在成功编译之后,就进入链接(Link)阶段。在该阶段,编译器把汇编阶段生成的二进制代码、程序中用到的库文件链接起来,完成链接之后,GCC就可生成可执行文件了,其命令如下所示。

978-7-111-33316-6-Chapter05-13.jpg

运行该可执行文件,出现正确的结果,如图5-1所示。

许多程序都是由多重源代码文件组成的,并且在进入链接阶段之前,每个源文件必须编译成目标代码。例如,有3个文件,分别为file1.c、file2.c和file3.c,GCC启动如下的命令:

978-7-111-33316-6-Chapter05-14.jpg

978-7-111-33316-6-Chapter05-15.jpg

图5-1 例5-1的运行结果

该命令将创建file1.o、file2.o和file3.o,并且把它们链接起来创建progname。另外,还可以在每个文件上分别使用GCC的-c选项,它从每个文件中都创建目标文件。然后再把所有的目标文件链接到一起创建一个可执行的文件。这样,以上命令就可以变为

978-7-111-33316-6-Chapter05-16.jpg

同时,这样也可以避免重新编译没有变化的文件。

【例5-2】编译多重源代码文件。

下面从多重源代码文件中创建一个二进制代码可执行文件。

设计步骤

1)在Vim中编写程序,该程序包括一个C源代码文件file1.c,一个头文件file2.h和一个C源代码文件file2.c。

2)创建如下代码。

978-7-111-33316-6-Chapter05-17.jpg

3)编译这些程序,创建example5_2的命令如下:

978-7-111-33316-6-Chapter05-18.jpg

4)运行程序,结果如图5-2所示。

978-7-111-33316-6-Chapter05-19.jpg

978-7-111-33316-6-Chapter05-20.jpg

图5-2 例5-2的运行结果

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈