1. h、lib、dll总体说明
.h头文件是编译时必须的,lib是链接时需要的,dll是运行时需要的。
附加依赖项的是.lib不是.dll。
若生成了dll,则肯定也生成 lib文件。
如果要完成源代码的编译和链接,有头文件和lib就够了。如果要使动态连接的程序运行起来,有dll就够了(放在Debug文件夹里)。在开发和调试阶段,当然最好都有。
.h .lib .dll三者的关系是:
.h文件:声明函数接口
.dll文件:函数可执行代码
.lib文件:帮助链接器找到.h文件中函数对应的函数执行代码
解释说明:当我们在自己的程序中引用了一个H文件里的函数,链接器怎么知道该调用哪个DLL文件呢?这就是LIB文件的作用: 告诉链接器调用的函数在哪个DLL中,函数执行代码在DLL中的什么位置,这也就是为什么需要附加依赖项 .LIB文件,它起到桥梁的作用。
如果生成静态库文件,则没有DLL ,只有lib,这时函数可执行代码部分也在lib文件中
2. lib文件和dll文件生成
参考:
https://www.cnblogs.com/wjcoding/p/11232570.html
3. exp文件
exp文件就是导出文件(export file)。使用linker去创建dll(中间还有它的导出库),我们假设我们生成两个dll(or just executables)。但是他们都需要调用一些对方中函数,问题出现了。当我们生成a.dll的时候我们需要b.lib;但是b.lib在对应的b.dll生成之前没有生成,而b.dll的生成又需要a.lib。正因如此,微软的解决办法是使用exp文件,或者叫导出文件。在生成两个dll之前,你使用lib.exe(library mangager tool库管理工具)来创建一个.lib和.exp,即,DLL A 的a.lib 和a.exp,现在linker使用a.lib和DLL B 自己的东西去生成b.dll和b.lib。当你回来链接DLL A的时候你就有了b.lib。这里linker需要知道a.dll中需要导出处啥。这些信息都被缓存到了a.exp文件中。linker不需要def文件或者/EXPORT选项,它仅仅是加载a.exp中的信息。a.exp就像a.dll的两个生成过程(lib.exe and linker)的联系者一样。相似的,linker不会再次生成a.lib。总的来说,这种循环调用的情况不会和在我们的程序中出现,因此,希望你不会再你的程序中用到exp文件。
总结:exp文件是两个之间的联系者