编译与链接
对于目前的应用程序开发,我们很少关注编译和链接的过程,通常都使用IDE将编译和链接一部完成,以下使对于编译和链接的过程的具体解析。
首先,要生成机器可以识别的二进制文件,必须经过以下几个步骤:
预处理 ------> 编译 -------> 汇编 ---------> 链接
一、预处理
预处理的过程主要处理源文件中以“#”开始的预编译指令。比如“#include”、“#define”等,处理规则如下:
1、将所有的”#define“删除,并且展开所有的宏定义。
2、处理所有条件预编译指令,比如“#if”、"#ifdef","#elif",“#else”,"#endif".
3、将#include的文件插入到预编译指令的位置。注意,这个过程使递归进行的,因为被包含的文件中可能还包含其他文件。
4、删除所有的注释“//”和“/* */”。
5、添加行号和文件名标识。
6、保留所有的#pragma编译器指令,因为编译器要使用它们。
以下用我们熟悉的hello world程序来了解此过程:
#include<stdio.h> int main() { printf("\nhello,word\n"); return 0; }
预编译命令:gcc -E hello.c -o hello.i
二、编译
编译过程就是把预处理完成的文件进行一系列的词法分析、语法分析、语义分析及优化后生产相应的汇编代码文件。
使用编译命令执行hello.i文件生成汇编文件:
gcc -S hello.i -o hello.s
三、汇编
汇编器是将hi便代码变成机器可以执行的指令,每一条汇编语句对应一条机器指令最终输出目标文件。
gcc -c hello.s -o hello.o
四、链接
链接就是将汇编生成的OBJ文件、系统库的OBJ文件、库文件链接起来,最终生成可以在特定平台运行的可执行程序。
gcc -o hello hello.o
gcc常用参数: