DLL和LIB
DLL:动态链接库 = 运行时链接
程序在内存中运行时遇到DLL对应的.h,则在内存中找有无该dll,找不到,则在Path/程序生成目录/vs指定的库目录下找改dll。找到后,程序与其链接。
所以N个进程可以共用一个dll
LIB:静态链接库 = 链接时链接
在程序链接阶段将lib里面的内容(一种lib是源码,一种lib是dll的地址)与目标模块链接,加入目标模块中,链接之后lib无用。
也就是独立的.lib不会进入内存。
只有N个程序可以共用一个lib(要在模块编译链接阶段就将lib的源码)
链接时,只链接静态链接库。
链接程序怎么确定程序是静态链接还是动态链接:
有LIB = 用静态链接
有dll = 运行时候再链接
例子:
#include a.h
aaa.b()//a里的类aaa的成员函数b
程序经历的过程:
编译:
词法分析:看aaa.b()在调用前有无声明或定义(a.h)
-所以aaa.b()只有声明没有定义这个不会再编译时报错,编译通过
链接:
链接所有lib进程序
装入运行:
aaa.b():
-搜索aaa.b()在的位置:搜索 进程源码 -> 搜索动态链接库dll(path -> 程序exe目录 -> 库包含目录下的dll)
-调用aaa.b(),进入b()函数体
注意:函数调用是在运行时才进入调用的代码
函数调用分两种:
1.调用的是DLL里的函数:
在内存中找有无dll有该函数,找不到,则在Path/程序生成目录/vs指定的库目录下找改dll。找到后,程序与其链接。
2.调用的是LIB里的函数:
LIB在链接的时候一定要链接到,要不然(链接时)就会报错。----ERROR LINK
存在问题:为什么无LIB会引发LINK ERROR,而不是引发运行时ERROR?