gcc简介
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。如图,
命令:
gcc hello.c -o hello
此处输入图片的描述 上面的命令一步由.c文件生成了可执行文件,将gcc的四个编译流程:预处理、编译、汇编、链接一步完成,下面将分别介绍这四个步骤。
3.-E的作用
只进行预处理,不做其他处理
例:只对hello.c进行预处理,生成文件hello.i,并查看,如图,
命令:
gcc -E hello.c -o hello.i
此处输入图片的描述
使用命令:#cat hello.i 查看生成文件内容。如图, 此处输入图片的描述
可以看到头文件包括部分代码#include经过预处理阶段之后,编译器已将stdio.h的内容贴了进来。
4.-S的作用
只是编译不汇编,生成汇编代码。如图,
例:将hello.i文件只进行编译不进行汇编生成汇编代码hello.s
命令:
gcc -S hello.i -o hello.s
此处输入图片的描述
可使用命令:#cat hello.s查看生成文件内容,如图, 此处输入图片的描述
5.-c的作用
只编译不链接,生成目标文件.o, 如图,
例:将汇编代码hello.s只编译不链接生成hello.o
命令:
gcc -c hello.s -o hello.o
此处输入图片的描述
6.将编译好的hello.o链接成库生成可执行文件hello,如图,
命令:
gcc hello.s -o hello.o
此处输入图片的描述
7.-static的作用
链接静态库
例:比较hello.c链接动态库生成的可执行文件hello和链接静态库生成的可执行文件hello1的大小。如图,
命令:
gcc hello.c -o hello
gcc hello.c -static -o hello1
此处输入图片的描述
可以看到静态链接的可执行文件hello1比动态链接的可执行文件hello要大得多,但他们的执行效果是一样的。
8.-g的作用
在可执行程序中包含标准调试信息,如图,
例:将hello.c编译成包含标准调试信息的可执行文件hello2
命令:
gcc -g hello.c -o hello2
此处输入图片的描述
注:带有标准调试信息的可执行文件可以使用gdb调试器进行调试,以便找出逻辑错误。
9.-O2的作用
完成程序的优化工作,如图,
例:将hello.c使用优化选项O2编译生成可执行文件hello1和正常编译生成的可执行文件hello进行比较。
命令:
gcc -O2 hello.c -o hello1