从一个.cpp文件到执行需要经历四个过程:
以一个实例来说明编译过程,假设现在有一个hello.c文件
1、预处理
gcc -E hello.c -o hello.i
主要内容如下:
(1)将所有的#define删除,并且展开所有的宏定义;
(2)处理所有的条件编译,如#if,#ifdef;
(3)处理#include预编译指令,将被包含的文件插入到该预编译指令的位置。该过程递归进行,及被包含的头文件内还包含其他的文件;
(4)删除所有的注释//和/**/;
(5)添加行号和文件标识,如#1 “hello.c”,以便于编译时编译器产生调试用的行号信息及用于编译时产生编译错误警告能够显示行号信息;
(6)保留所有的#pragma编译器指令,因为编译器需要使用它们。
2、编译
生成汇编代码。
主要内容如下:
(1)语法分析
(2)词法分析
(3)语义分析
(4)符号汇总
gcc -s hello.i -o hello.s
3、汇编
汇编器将汇编代码转换为机器可以执行的命令。
主要内容如下:
(1)形成符号表
(2)汇编转换为二进制指令
gcc -c hello.c -o hello.o
4、链接
生成可执行文件。
主要内容如下:
(1)合并段表
(2)符号表的合并
(3)符号表的重定位
gcc -o hello hello.o
运行的时候,也分为几个步骤:
(1)加载到内存
(2)进入main函数
(3)执行程序代码
(4)结束程序
在linux环境下,程序编译的过程:
-E:将.c文件预处理为.i文件
-S:将预处理输出的.i文件汇编成.s文件
-c:将汇编输出的。s文件编译输出.o文件
-o:将.c文件预处理、编译、汇编、链接形成可执行文件。-o选项用来指定输出文件的文件名