一个程序的编译过程分为四个阶段:预处理、编译、汇编、链接。
预处理阶段,预处理器主要做四部分工作,分别是:头文件展开、宏替换、去注释以及条件编译。
编译阶段就是将C语言转换成汇编语言的一个过程。汇编语言程序中的每条指令都以一种标准的文本格式确切的描述了一条低级机器语言指令。
汇编阶段就是将汇编语言就是将汇编语言翻译成机器语言指令的一个过程,由汇编器完成,处理完成之后得到一个二进制文件。
链接阶段由连接器负责完成,它将代码中调用的库函数、外部函数、程序员自己编写的函数等所有文件(经过汇编阶段完成后得到的二进制文件)处理成一个可执行文件,这就是链接阶段完成的。
.a .so 为后缀的文件是由目标文件构成的库文件;.c 为C语言代码文件;.C .cxx .cc为C++代码文件;.h为头文件;.i .ii分别为预处理过的c和c++源代码文件;.o 是编译后的目标文件;.s .S分别为汇编语言源代码文件和预处理完后的汇编语言源代码文件。
预处理 :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
-o:指定生成的输出文件; -E:仅执行编译预处理; -S:将C代码转换为汇编代码; -wall:显示警告信息; -c:仅执行编译操作,不进行连接操作。
选项 -O
gcc -O1 test.c -o test 使用编译优化级别1编译程序。级别为1~3,级别越大优化效果越好,但编译时间越长。
多个文件一起编译 gcc testfun.c test.c -o test
分别编译各个源文件,之后对编译后输出的目标文件链接。
gcc -c testfun.c #将testfun.c编译成testfun.o
gcc -c test.c #将test.c编译成test.o
gcc -o testfun.o test.o -o test #将testfun.o和test.o链接成test
以上两种方法相比较,第一中方法编译时需要所有文件重新编译,而第二种方法可以只重新编译修改的文件,未修改的文件不用重新编译。
来自: http://man.linuxde.net/gcc