预处理(需要头文件)(.c) -> 编译器将源码转换为汇编代码(.asm) -> 汇编器将汇编代码转换为目标文件,即二进制文件 (.obj)-> 链接器将目标文件和库链接(需要库文件)(.exe)->运行
一、编译和链接
编译:只要有头文件中的声明就足够了,头文件只是告诉编译器,函数是如何去调用如何返回
链接:把已经编译好的.obj和现有的.lib文件进行链接,这时生成可执行文件
二、头文件和库文件
头文件:提供声明,编译的时候需要
库文件:提供定义/实现,链接时将指定的目标文件抽取出
三、库
1. lib后缀的库有两种
- 静态链接库(.lib):静态库是一个或者多个obj文件的打包,包含了实际执行代码
- 动态链接库的导入库(.lib):属于动态链接库的附加依赖项,只包含了确保程序找到对应函数的一些基本索引信息
2. dll后缀的库
动态链接库(.dll):是具体的实现,程序运行时动态调用
n
四、静态链接
1. 用到的库
静态链接库:(.lib为后缀)是一个或者多个obj文件的打包 ,『 链接时使用』
2. 静态链接
把.lib文件中用到的函数代码直接链接进可执行文件,程序运行的时候不再需要其它的库文件
3. 优点
程序在运行时与其它库函数无关,用户安装时就不需要再挂动态库,移植方便
4. 缺点
所有相关的目标文件和函数库被链接合成一个可执行文件,当多个程序都调用相同函数时,内存中就会存在这个函数的多个拷贝,浪费空间和资源
五、动态链接
1. 用到的库
- 动态链接库的导入库: (.lib为后缀)属于动态链接库的附加依赖项,一般是一些索引信息,告诉链接器调用的函数在哪个dll中,函数执行代码在dll中的什么位置,『 链接时使用』
- 动态链接库:(.dll为后缀)具体的实现,『 程序运行时使用』
2. 动态链接
调用的函数代码并没有被拷贝到可执行文件中,仅仅在其中加入了所调用函数的索引信息,只有当应用程序被装入内存开始运行时,在Windows的管理下,才在应用程序与相应的dll之间建立链接关系。
3. 优点
这样当一个或多个应用程序运行时,才将程序代码和被调用的函数代码链接起来,从而节省了内存资源
4. 缺点
dll 和 lib 文件必须随应用程序一起发行,否则应用程序将会产生错误