【C深入】19_编译过程简介

被隐藏的过程


预编译:

处理所有的注释,以空格代替

将所有的#define删除删除 ,并且展开所有的宏定义

处理条件编译指令#if, #ifdef, #elif, #else, #endif 

处理#include ,展开被包含的文件

保留编译器需要使用的#pragma指令指令

预处理指令:



编译:

对预处理文件进行一系列词法分析 ,语法分析和语义分析

词法分析主要分析关键字 ,标示符,标示符 ,立即数等是否合法

语法分析主要分析表达式是否遵循语法规则

语义分析在语法分析的基础上进一步分析表达式是否合法

分析结束后进行代码优化生成相应的汇编代码


汇编:

汇编器将汇编代码转变为机器可以执行的指令

每个汇编语句几乎都对应一条机器指令


链接:

链接器主要作用是把各个模块之间相互引用的部分处理好,使得各个模块之间能够正确的衔接。


静态链接




运行两个程序有两个同样的拷贝,浪费内存空间。


动态链接


只要吧a.out里面要调用的其他库lib1.so、lib2.so里面的函数告诉l链接器是存在的,如果要调用stub1里面申明的函数,就知道是外部的lib1.so里面定义的,在运行的时候如果调用到这个函数,就再去动态的链接过去即可。



.so库文件没有跟应用程序绑定在一起,如果程序需要用到库中的函数,程序会到内存中.so库中找到函数的定义,这样好处就是几十运行多个程序,有一部分占用的内存是动态链接库占用的,它是一个公共的的部分,这样可以节省内存。

动态链接虽然节省空间,但是效率相比静态链接会低一点。要用max()的时候,还要有一个寻址操作,到内存找lib.so库是否存在,如果存在,直接调用max(),如果不存在,操作系统还要去把lib.so装载到内存中,装载过程需要时间,在装载过程中,应该程序将被挂起不会执行,只有当lib.so完全装载成功,max()才会调用。

静态链接在编译期完成,动态链接在运行期完成。

到底用动态链接还是静态3链接,要看实际工程本事需要。