先说静态调用
比如说你写个exe程序 ,
在程序中要静态调用一个dll文件
一般会有下面这么一句 ,当然这不是必须的,你也可以通过工程 设置 链接 添加这个lib
#pragma comment(lib, "dll2.lib")
意思是要把dll2.lib这个文件的信息编译到exe这个程序当中的,
所以你必须把你的dll2.lib和dll2.dll都得放入exe所在的文件夹
dll2.lib是用于编译的时候用的, dll2.dll是当exe文件执行的时候用的
当编译好了以后 这个dll2.lib文件就没有用了 ,因为它的信息已经编译到exe中了
所以当你发布的时候 就可以把这个dll2.lib删除了,只留下dll2.dll就可以了
总结一下 lib文件是编译的时候要必须要用到的,如果程序在编译的时候就
没有找到你需要的lib文件 会给出错误提示的。 当编译完成后lib文件就可以删除了
只留下dll就可以了
动态调用
只需要dll就可以了 和lib一点关系都没有。
不管是dll调用时静态调用还是动态调用 最后软件发布的时候和lib文件是否被打包是没有关系的。
它们之间的区别
静态调用的dll在一个在程序初始化时载入,如果DLL文件错误,或不存在会导致程序无法运行!
动态调用的dll用API动态载入,DLL错误不会导致程序本身出现问题!
对
于静态链接的DLL,主程序所引用的DLL的所有导出函数都会在LINK时建立一张引入表(见PE文件格式);在装载主程序时,同时会装入DLL,并由操
作系统对其进行重定位。如果这时DLL在搜索路径中不存在,主程序将出现装载错误而失败,根本不能运行;而且,在整个主程序的运行期中,DLL不能卸载;
而对于动态链接的DLL,则是由显式的 LoadLibrary->
GetProcAddress来进行调用的。主程序在装载时,并不会同时装入DLL,如果这时DLL在搜索路径中不存在,主程序不会出现装载错误。只有当
LoadLibrary执行时,才真正开始主程序与DLL的引用和依赖关系。而且,当该DLL的导出函数不再需要时,可以随时卸载DLL
阅读(1941) | 评论(0) | 转发(0) |