gcc编译一个hello world程序主要经历四个步骤:
1.预处理
2.编译
3.汇编
4.链接
------------------------------------------------------------------------------------------
一 预编译:
examp:gcc -E hello.c -o hello.i
预编译过程主要处理源代码中的以“#”开始的指令.比如:“#include”, "#define"等。处理规则如下:
(1)删除“#define”, 展开所有的宏定义 (2)处理预编译指令。如“#if”, “#ifdef”, “#elif” (3)处理“#include”预编译指令,将被包含的文件插入到该预编译指令的未知。 (4)删除所有的注释“//”和“/**/”
经过编译后的.i文件不包行任何宏定义,已经被展开。包含的头文件也插入到.i当中。
二 编译:
gcc -S hello.i -o hello.s
进行一系列的词法分析,语法分析,优化后产生的相应的汇编代码文件。属于核心部分。现在的GCC把预编译和编译两个步骤合并为一个。
是使用一个叫做ccl的程序来完成的
三 汇编
汇编是将汇编代码转变成机器可以执行的指令,每一个汇编指令都对应一条机器指令。
as hello.s -o hello.o
四 链接
打包成一个静态库 ar rs libstack.a stack.o push.o pop.o is_empty.o
库文件名都是以lib 开头的,静态库以.a作为后缀,表示Archive。ar命令类似于tar 命令,起一个打包的作用,但是把目标文件打包成静态库只能用ar命令而不能用tar 命令。选项r表示将后面的文件列表添加到文件包,如果文件包不存在就创建它,如果文件包中已有同名文件就替换成新的。s是专用于生成静态库的,表示为静态库创建索引,这个索引被链接器使用。
gcc main.c -L. -lstack -Istack -o main -L选项告诉编译器去哪里找需要的库文件,-L. 表示在当前目录找。-lstack告诉编译器要链接libstack 库,-I选项告诉编译器去哪里找头文件。注意,即使库文件就在当前目录,编译器默认也不会去找的,所以-L.选项不能少。