GCC是GNU项目的编译器组件之一,也是GNU最具有代表性的作品。在GCC设计之初仅仅作为一个C语言的编译器,可是经过十多年的发展,GCC已经不仅仅能支持C语言;它现在还支持Ada语言、C++语言、Java语言、ObjectiveC语言,Pascal语言、COBOL语言,以及支持函数式编程和逻辑编程的Mercury语言,等等。而GCC也不再单是GNU C Compiler的意思,而是GNU Compiler Collection也即是GNU编译器家族的意思了,目前已经成为Linux下最重要的编译工具之一。 GCC是一个交叉平台的编译器,目前支持几乎所有主流CPU处理器平台,它可以完成从C、C++、Objective C等源文件向运行在特定cpu硬件上的目标代码的转换,GCC不仅功能非常强大,结构也异常灵活,便携性(protable)与跨平台支持(cross-plantform. support)特性是GCC的显着优点。
实验目的:
学会使用GCC编译器
实验要求:
编写一应用程序,使用GCC进行编译并分别使用-o,-g,-static,-o2等项。
实验步骤:
1.先使用vi编辑hello.c文件,内容如下图所示:

2.GCC指令的一般格式为:gcc[选项]要编译的文件[选项][目标文件]
例使用GCC编译命令编译hello.c并生成目标文件hello,并运行hello。如图

上面的命令一步由.c文件生成了可执行文件,将gcc的四个编译流程:预处理、编译、汇编、链接一步完成,下面将分别介绍这四个步骤。
3.-E的作用 ,只进行预处理,不做其他处理。例:只对hello.c进行预处理,
生成文件hello.i,并查看,如图

使用命令:cat hello.i 查看生成文件内容。如图

可以看到头文件包括部分代码#include<stdio.h>经过预处理阶段之后,编译器已将stdio.h的内容贴了进来。
4.-S的作用
只是编译不汇编,生成汇编代码。如图,
例:将hello.i文件只进行编译不进行汇编生成汇编代码hello.s

可使用命令:cat hello.s查看生成文件内容,如图

5.-c的作用
只编译不链接,生成目标文件.o, 如图,
例:将汇编代码hello.s只编译不链接生成hello.o

6.将编译好的hello.o链接成库生成可执行文件hello,如图

7.-static的作用
链接静态库
例:比较hello.c链接动态库生成的可执行文件hello和链接静态库生成的可执行文件hello1的大小。如图

可以看到静态链接的可执行文件hello1比动态链接的可执行文件hello要大得多,但他们的执行效果是一样的。
8.-g的作用
在可执行程序中包含标准调试信息,如图,
例:将hello.c编译成包含标准调试信息的可执行文件hello2

9.-O2的作用
完成程序的优化工作,如图,
例:将hello.c使用优化选项O2编译生成可执行文件hello1和正常编译生成的可执行文件hello进行比较。

总结
通过本次实验,我有以下两个收获。
第一点,通过本次实验,使我更好的理解C程序的运行机制。它可以帮助我更准更快的发现和解决程序中的错误和问题。第二点,通过比较hello.c链接动态库生成的可执行文件hello和链接静态库生成的可执行文件hello1的大小。我发现链接静态库的可执行文件远远大于链接动态库生成的可执行文件。