为什么创建动态.dll文件时会有一个.lib文件?

why there is a .lib file when create dynamic .dll file?

我尝试在 windows 上使用 visual studio 构建动态 dll 库,但是生成了两个文件,一个是 dll 文件,另一个是 .lib 文件;

我对使用dll库的了解仅限于链接器,我不知道.lib文件的用途是什么,它的文件扩展名与静态库相同,但它肯定不是静态库;

在所有情况下创建动态dll库时visual studio是否生成.lib文件?

我需要在我的应用程序中使用 .lib 文件吗?

如何在我的应用程序中使用 .lib 文件?

"implicit" linking and "explicit" linking的区别有关。一句话回答你的问题是,当你隐式 linking 时,通常称为“存根库”并正式称为“导入库”的 .lib 文件是必需的,但在其他情况下则不需要。

在隐式 linking 中,编译器在编译时生成用于调用 DLL 的外部函数引用,然后 linker 需要 link 那些东西:它使用导入库来帮助它做到这一点。 linker 将这些调用视为特殊情况;它在可执行文件中插入代码以查找 DLL 并调用 DLL 以实现特定功能。

从程序员的角度来看,隐式 linking 的行为类似于静态 linking 除了 DLL 需要位于某个地方当应用程序为运行时系统可以找到它,否则系统会在应用程序启动时弹出错误对话框。

Explicit linking 意味着程序员有责任查找和加载 DLL 并知道 DLL 中有哪些函数以及如何调用它们。有关详细信息,请参阅 LoadLibrary and GetProcAddress。如果库的使用是有条件的,或者对于具有插件架构的应用程序,在编译时甚至可能不知道要使用的实际 DLL,则显式 linking 很有用。

但一般来说,如果隐式 linking 可以满足您的需求,那么这样做会更容易。