编译过程分为五步:
扫描解析文件预处理工作处理宏定义,不管是由-D参数指定,还是在源码内部通过#define,或者使用了标准库,扩展库中的宏,都会替换为定义的值。 命令:cpp a.c>a.i
输出的a.i就是预处理过的文件,包含了完整的内容。 由此可以得出,宏不是运行时的定义内容,也不是编译时的内容,而是预处理阶段就完成的。
将源代码(也就是预处理过的代码)编译为特定机器的汇编语言。 命令:gcc -S -Wall a.i
输出为特定的汇编内容。
将汇编源码汇编为机器码内容。 命令:as a.s -o a.o
此处如果有对外部的函数使用,则会预留未定义的地址,以供最后一步链接来使用。
将链接对象文件(上编译汇编后的文件)链接为可执行文件,此过程比较复杂,需要链接很多外部的库文件,包括静态的,动态的库。 命令:ld -dynamic-linker .. .. ..
可以使用gcc a.o
来简化上一过程。 最后得出的是可执行文件。
新闻热点
疑难解答