part1:13-linux编译器GCC

Gcc特点

Gcc基本用法

1、gcc的概念

GCC(GNU Compiler Collection,GNU编译器套装),是一款由GNU开发的编程语言编译器。GCC原名为GNU C 语言编译器,因为它原本只能处理C语言。GCC很快地扩展,变得可处理C++。之后也变得可处理Fortran、Pascal、Objective-C、java,以及Ada与其他语言。

2、GCC的执行过程

使用GCC,把C语言源代码文件生成可执行文件的过程不仅仅是编译的过程,而是要经历四个相互关联的步骤预处理(也称为预编译,Preprocessing)、编译(compilation)、汇编(assembly)、和链接(linking)。

命令gcc首先调用cpp进行预处理,在预处理过程中,对源代码文件中的文件包含(include)、预编译语句(如宏定义define等)进行分析。接着调用cc1进行编译,这个阶段根据输入文件生成以.o为后缀的目标文件。汇编过程是针对汇编语言的步骤,调用as进行工作,一般来讲,.S为后缀的汇编语言源代码文件和汇编.s为后缀的汇编语言文件经过预编译和汇编之后都生成以.o为后缀的目标文件当所有的目标文件都生成以后,gcc就调用ld来完成最后的关键性工作,这个阶段就是链接。在链接阶段,所有的目标文件被安排在可执行程序中的恰当的位置,同时该程序所调用的库函数也从各自所在的库中连到合适的地方。以上这些过程是gcc内部实现的机制,实际使用中,上述过程可以通过gcc的选项实现。

gcc命令的一般格式为:gcc [选项] 要编译的文件 [选项] [目标文件] eg:gcc hello.c -o hello;本过程实际上将预处理、编译、汇编、链接一步完成。下面分别介绍每个流程

执行预处理工作:gcc -E hello.c -o hello.i  生成hello.i

执行编译处理工作:gcc -S hello.i -o hello.s生成汇编文件hello.s

执行编译工作:gcc -c hello.s -o hello.o  对hello.s进行汇编,生成目标文件hello.o

执行链接工作:gcc hello.o -o hello

编译选项

使用-g选项,在可执行程序中包含标准调试信息。使用命令gcc -g hello.c -o hello2生成包含调试信息的文件hello2,带有调试信息的可执行文件可以使用gdb调试器进行调试。

使用-D选项,在编译时进行宏定义。使用命令gcc -DLINUX hello.c -o hello3生成了宏LINUX的可执行文件hello3。

使用-O2选项,完成程序的优化工作

time ./hello 测试hello可执行文件的执行时间。

-Wall:生成所有的警告信息

-w:不生成任何警告信息

-DMACRO:使用-D定义MACRO宏,等效于在程序中使用#define MACRO

 

每一个编译器都有标准的寻找头文件的路径!!!!gcc会在/usr/include/下面去找

-I dirname:将dirname所指出的目录作为编译器寻找头文件的标准路径。对于<>,gcc在系统预设的头文件目录(如/usr/include)中搜寻相应的文件;而对于"",gcc在当前目录中搜寻头文件。-I作用是告诉gcc,如果在当前目录未找到需要的头文件,就到指定的dirname目录中去寻找:eg:gcc foo.c -I /home/include -o foo

-static 将产生一个和static库一道链接的可执行文件。当没有开启-static选项时,链接器首先试着用共享库,假如共享版本不可用,然后再试着用静态库。

-shared 告诉gcc产生一个共享库,该共享库能在链接时和其他的共享文件一起形成可执行文件,该共享库也能在运行时装载进可执行文件的地址空间,使用-shared是创建一个共享ELF库的首选方法。

posted on 2016-05-17 13:49  gary_123  阅读(281)  评论(0编辑  收藏  举报

导航