为什么在链接.lib后会出现丢失的dll错误?

时间:2012-03-19 21:41:22

标签: windows dll linker

我从1999年开始研究这个Windows程序。我无法在Visual Studio中构建它,因为它一直给我链接器有关缺少符号的错误。然后我的同事告诉我尝试从原始项目中获取.lib文件,并尝试将它们指定为其他链接依赖项。我做到了,程序链接得很好。当我试图运行它时,它抱怨丢失了dll文件。所以我发现在一些旧计算机上运行的Windows程序的现有副本,复制了dll文件,我的构建开始工作!这是我生命中最快乐的一天,但我不太清楚发生了什么。

有人能简单解释一下Windows中的lib文件以及它们与dll的关系吗?

2 个答案:

答案 0 :(得分:5)

Windows上有两种.LIB文件用法。 Ken提到了其中一个,这是用于静态链接,但还有另一种用法,称为import library,这就是你在这里所拥有的。如果您自己构建.DLL,则可以选择为其生成导入库。这样做的结果是您可以像对常规静态库一样链接.LIB文件,但.LIB实际上只包含用于从DLL加载入口点的样板代码。

这个有用的原因是您可能需要将代码分发为dll(例如,您可以独立于主应用程序更新它,或者将dll作为插件提供),但它使得链接到应用程序更容易,因为.LIB会处理LoadLibrary()GetProcAddress()来电,因此您无需这样做。它还可以从dll加载类定义,而您自己无法使用GetProcAddress()

有关MSDN

的更多信息

答案 1 :(得分:0)

.LIB(库)文件是已编译的源文件(目标文件)的集合,您可以将其链接到应用程序以提供功能。链接使目标文件成为可执行文件本身的一部分。这通常称为static linking,这就是为什么你得到关于丢失符号的编译时错误的原因;库文件不可用于从中提取所需的目标代码,以便将其添加到您的应用程序中。

.DLL(动态链接库)文件是已编译的源文件,您可以在运行时加载它们并使用特定功能(通常按名称);它们不是可执行文件的一部分,但是在运行时从DLL本身加载。 (没有可用的DLL,正如您已经体验过的那样,意味着您的应用程序无法运行。)它们在编译时不需要,但仅在运行时才需要。

某些IDE(例如Visual Studio C / C ++)同时提供静态.LIB文件和.DLL版本,因此您可以选择将运行时库直接链接到您的应用程序或让它们可以在运行时动态加载。 (第二个是有用的,例如,如果您已经开发了多个应用程序;您可以使用动态版本的MSVCRTL通过单独分发RTL而不是链接到每个应用程序来大幅减少可执行文件的大小。 / p>