一、GCC介绍
Linux系统下的GCC是GNU推出的功能强大、性能优越的多平台编译器,它可以在多种硬件平台上编译处可执行程序的超级编译器,其执行效率比一般的编译器的效率要高20%~30%。
Gcc编译器能将C、C++语言源程序、汇程式化序和目标程序编译、连接成可执行文件,如果没有给出可执行文件的名字,gcc将生成一个名为a.out的文件。在Linux系统中,可执行文件没有统一的后缀,系统从文件的属性来区分可执行文件和不可执行文件。
二、linux中对于一些源文件后缀指出的语言种类介绍和后期的操作
在linux系统上使用gcc编译器,必须先了解一些文件的格式及作用,就会知道每一步都是做什么的。
.c C源程序 ; 后期可以进行预处理,编译,汇编,链接
.C C++源程序;后期进行预处理、编译,汇编 ,链接
.cc C++源程序;后期进行预处理、编译,汇编 ,链接
.cxx C++源程序;后期进行预处理、编译,汇编 ,链接
.m objective-C源程序;后期进行编译,汇编 ,链接
.i 预处理后的C文件;后期进行编译,汇编 ,链接
.ii 预处理后的C++文件;后期进行编译,汇编 ,链接
.s 经过编译后的汇编语言程序;汇编,链接
.S 汇编语言的源程序;预处理,汇编,链接
.h 预处理器文件;一般不会出现在命令行参数上,一般直接在源程序中使用#include
.o 生成的目标程序;使用连接器最后生成可执行程序
.a 归档文件,也就是将.o文件封装起来,执行一定的功能
.so 动态链接库
三、 GCC的一般的执行过程
一般经过四个步骤:预处理(也称预编译,Preprocessing)、编译(Compilation)、汇编(Assembly)和连接(Linking)。
Gcc指令的一般格式为 Gcc[选项] 要编译的文件 [选项][目标文件]
1、预处理阶段:
目的:使include之中的内容编译进去,并且用-E命令作用是进行查看,Gcc的预处理过程结束后停止编译。
使用常见的hello.c举例说明:
gcc -E hello.c -o hello.i
//-E:表示对于源文件只执行预处理的操作,其结果变为.i文件,-o表示后面指定预处理后的文件名
2、编译阶段
目的:使预处理后的.i文件生成.s的汇编代码,其中-S就是编译器阶段的标志,执行完结束。
gcc -S hello.i -o hello.s
3、汇编阶段
目的:使生成的汇编代码生成二进制代码,此时的.o文件已经是ELF文件的格式,不能直接的查看其内容,但是可以使用objdump -d * .o反汇编。生成汇编代码可以查看。
gcc -c hello.s -o hello.o
4、链接阶段
在汇编结束后,就会进入链接阶段,这是最后一个步骤,此时函数库就很重要了。链接过程分为动态链接和静态链接。静态链接的文件是.a,而动态链接的形式是.so的形式。对于其具体的链接过程以后再详细介绍。
gcc hello.o -o hello
最后一步,那就是对于生成的可执行程序执行了,使用"./程序名"就可以。
./hello
总结:
gcc -E hello.c -o hello.i
gcc -S hello.i -o hello.s
gcc -c hello.s -o hello.o
gcc hello.o -o hello
./hello
注意:
(1)目标文件(.o)和可执行程序都是二进制的ELF文件,区别在于是否进行了动态/静态库的链接。
(2) 对于ELF文件感兴趣的可以使用readelf 和objdump命令查看他们里面到底有什么。
(3) 想要查看更多的关于gcc的有些使用方法及技巧,可以参开gcc 的五大手册,链接如下:
(4)在Linux系统中,也可以直接的适应系统自带的帮助手册,使用gcc -v --help,更加详细的介绍了命令行参数的使用。