一、动态库在被开发出时会产生3个文件,dll、lib、头文件。
1.头文件:包含动态库的函数原型
2.Lib文件:与静态库不同,它是dll的引入库文件。它是dll在编译、链接成功后生成的文件。主要包含动态库中函数的名称以及在动态库中的位置。
3.dll文件:包含动态库的函数代码。
二、关于dll 的lib
Lib编译时嵌入到了exe程序当中,dll文件是运行期才会调用。
lib引入库文件包含被DLL导出的函数的名称和位置,DLL包含实际的函数和数据,Lib在程序编译时就已经嵌入到了exe程序当中,应用程序运行时就
通过嵌入到的lib信息找到所需要的dll文件,然后调用dll中的函数执行。
使用LIB文件链接到所需要使用的DLL文件,库中的函数和数据并不复制到可执行文件中,因此在应用程序的可执行文件中,存放的不是被调用的函数
代码,而是DLL中所要调用的函数的内存地址,这样当一个或多个应用程序运行是再把程序代码和被调用的函数代码链接起来,从而节省了内存资源。
三、系统API是如何实现的?
系统API采用的是隐式链接方式供我们调用API 的。
一般我们在写程序时先#include系统API头文件,然后在编译器的项目设置中,自动填写了需要到的.lib库,API所在的dll库一般在C:\WINDOWS\system32
目录下,程序调试或执行时编译器会自动搜索这个路径!
说到这会产生疑问,为啥写好的程序不用打包dll、lib文件就直接就能执行呢?这是因为程序执行时会自动搜索系统的dll目录!
四、如何把dll给别人使用?应用打包程序时应打包什么?
1. 使用
开发者:如果是自己所编写的dll和lib,头文件,开发者在调用使用时,就该先把dll文件放入到自己的bin目录下,lib文件放在任何目录下都行,只要在编译器里引用正确就可以,最后再把头文件include到自己工程中。
一般大众:只需把dll和exe打包好就可以。
2. 应用程序打包:
只需把dll和exe打包就可以。
为啥不用打包lib和头文件?
因为程序在编译生成时已经把lib信息嵌入到程序里面了,程序里包含的只是dll函数所在的dll位置,然后根据位置找 到所需要的dll文件,从而执行。
头文件里只是一些函数声明,而exe程序里已经包含了这些函数名,所以不需要打包头文件。