源代码编译与链接过程简介

本文参考:https://blog.csdn.net/calm_agan/article/details/86659138 

  • 前言

我们使用Visual Studio等IDE写完源代码(.c或.cpp文件)之后,经过编译和链接两个步骤最终生成动态链接库文件(DLL)或可执行文件【.exe(WIndows格式)或.out(Linux格式)】。

  • 编译

VS默认的编译器工具是cl.exe,常用的编译器还有gcc。编译又分为预编译、编译、汇编三个步骤。

预编译:

源代码文件相关的头文件,被【预编译器】预编译成一个格式为.i的文件。预编译过程,主要处理那些源代码中以#开头的预编译指令。 经过预编译后的.i文件,不包含任何宏定义。

 如 :(1)展开所有的宏定义(#define);(2)处理所有的条件预编译指令(#if,#ifdef,#else,#endif等);

                     (3) 将被包含的文件插入到预编译指令所在位置(#include);(4)去除所有的注释行(//,/* */);

                     (5)保留所有的编译器指令(#program) 

编译:

对预编译后的文件,进行一系列的词法分析,语法分析,语义分析和优化,产生格式为.s的汇编代码文件。

汇编:

将汇编代码转换为二进制的机器语言,即格式为.obj(windows系统)或.o(linux系统)的目标文件。一般来说,每个源文件都应该对应于一个目标文件。

  • 链接

VS默认的链接器工具是link.exe

链接过程就是处理各个模块之间的相互引用,使各个模块之间能够正确衔接起来。链接程序将编译后形成的一组目标模块以及它们所需要的库函数链接在一起,形成一个完整的载入模型。

链接主要解决地址和控件分配,符号解析和重定位几个步骤。在编译阶段生成目标文件时,会暂时搁置那些外部引用,而这些外部引用就是在链接时进行确定的,链接器在链接时,会根据符号名称去相应模块中寻找对应符号。待符号确定之后,链接器会重写之前那些未确定的符号的地址,这个过程就是重定位。链接一般分为静态链接、载入时动态链接以及运行时动态链接三种。

 

猜你喜欢

转载自blog.csdn.net/jgj123321/article/details/94602620