预处理阶段:
预处理(preprocessing)指令:
gcc -E hello.c -o hello.i
将.c文件翻译成.i文件,预处理器指令以#号开头,预处理器执行宏替换(比如 #define)、条件编译(比如#if、#elif、#else、#endif、#ifdef、#ifndef)以及包含指定的文件(比如#include)。
编译阶段:
编译(compilation)指令:
gcc -S hello.c/hello.i -o hello.s
将.i文件翻译成.s文件,即汇编语言程序。
g++ -S指令并非必须经过预处理后的.i文件,-S选项的功能是令GCC编译器将指定文件预处理至编译阶段结束。
也就是说g++ -S可以处理.i文件,也可以处理原代码文件。
汇编阶段:
汇编(assembly)指令:
gcc -c hello.s -o hello.o
将.s文件翻译成.o文件,汇编器将.s文件翻译成机器语言指令,即.o文件,hello.o 文件:可重定位目标文件(机器码文件),是二进制文件,由汇编文件经过汇编操作生成,该文件不可直接执行。
链接阶段:
链接(assembly)指令:
gcc -o hello.o -o hello(.out)//后面的.out一般省略不写
hello(.out) 文件:二进制可执行目标文件(也是一个目标文件),由机器码文件进一步链接生成。这一步中,各种符号引用和符号定义转换成为可执行文件中的合适信息,通常是虚拟地址。
文本程序里的各种函数都存在有自身的.o的单独预编译好的目标文件,连接器就是将这些函数自身的.o文件合并在整个.o文本程序中。
静态库、动态库区别来自【链接阶段】如何处理库,链接成可执行程序。分别称为静态链接方式、动态链接方式。
以上4个步骤也可直接一步生成:
gcc hello.c -o hello//一气呵成指令
以上各个阶段的指令都是gcc编译的,想使用C++编译的话将各个阶段的指令中的gcc改为g++,然后将hello.c文件改为hello.cpp即可。