库
windows程序,一般包括静态库和动态库
静态库
在链接阶段库将会与目标汇编后的目标文件.o一起打包生成可执行文件。成为可执行文件的一部分,后续此库就可以消失了。也就是说在编译的最后一步(链接阶段),如果程序需要使用静态库,在这一步都会一起打包到可执行文件中。
优点:
使可执行文件依赖项少,已经被打包到可执行文件中了
编译阶段完成链接,执行期间代码装载速度快
缺点:
使可执行文件变大
若作为其他库的依赖库,将会造成多余的副本,因为必须与目标文件打包
升级不方便,升级必须重新编译
动态库
程序执行过程中调用dll。
**显示加载:**所需文件:dll文件。利用LoadLibrary()函数进行加载。
隐式加载: 所需文件:接口.h头文件,dll文件,lib文件。.h和.lib加载方式与静态加载完全一致。但.dll文件必须放在环境变量指定的目下。当然通常是与目标.exe文件放在一起。
优点:
动态库可以实现进程之间资源共享,有一份就行。
升级程序简单,不需要重新编译。
缺点:
运行期间在加载,将会减慢代码执行速度。
增加程序的依赖项,必须跟着可执行文件一起。
CRT(C运行时库)
CRT运行时库是程序在运行时所需要的库文件,通常运行时库是以LIB或DLL形式提供的
dll中申请内存,外部释放的问题
CRT库采用了全局变量来保存这个对象。
CRT静态链接 :CRT库的代码会链接到各个DLL中去,也包括这个全局变量。也就是说,每个使用CRT静态链接的dll中都有一个自己的全局堆句柄,他们自己都在这个句柄上使用内存。当释放dll中分配的内存时由于使用的堆句柄不一致于是出错。
CRT动态链接 :每个dll都是去调用CRT库的dll函数来分配和释放内存的,使用的是同一个句柄,所以没问题