在上节已经知道了通过命令,可以将源程序文件编译生成一个可执行文件,但是这其中经过了哪些步骤,才到最后可执行文件,中间的过程发生了什么,今天就来一起看下gcc的编译过程。
gcc 编译过程 :
第一步: 预处理
#gcc -E hello.c -o hello.i
将宏定义的头文件添加进.i文件中。
第二步:编译阶段
#gcc -s hello.i -o hello.s
将源程序添加了头文件的.i文件编译成汇编语句。
第三步:汇编
#gcc -c hello.s -o hello.o
将上面生成的汇编语句汇编成机器语言。
第四步:链接
#gcc hello.o -o hello
将多个目标模块链接成一个大的目标模块,汇集成一个可执行的二进制代码文件。
通过上述描述的gcc编译过程,相信已经可以理解从源程序到可执行文件的一个具体过程,这对自己对编译有一个深层次的了解。
下面再看一些gcc的一些其他功能,而且,这些在以后程序的编译中会经常用到,主要有警告提示功能,优化功能,调试选项,下面挨个介绍。
gcc警告提示功能:
#gcc -pedantic
在编译时加上这个选项可以对源文件中使用了非标准时产生相应的警告功能。
gcc 优化功能:
#gcc -O[123]
其中,-O和-O1效果相同。
可以在编译时对源程序进行不同等级的优化,从而提高代码的执行效率,-O3优化级别最高,当然了效果相对也最好,-O2,-O1依次次之。在验证时可以写一个很糟糕的但是没有语法错误的程序,分别用-O1,-O2,-O3来优化,并且测试每个的执行时间,从而体会优化的效果。
gcc 调试选项:
#gcc -g 或 -ggdb
-g后面也可加1,2,3,表示不同的调试级别,默认为2
在编写程序时,难免会出错,而调试对于程序员来说,更是家常便饭,在linux 下调试c程序时,需要加上-g 或-ggdb 选项。有关于程序的调试gdb,在下节介绍。