什么是.exp的作用?.lib和.dll有什么区别?

87
在编译和链接期间,.exp文件有什么作用?.lib和.dll文件有什么区别?我知道在链接时会使用.lib文件,在运行程序时会使用.dll文件。但是.lib和.dll之间到底有什么区别呢?
.lib文件中是否不包含来自.dll文件的函数代码?为什么需要使用两个单独的文件?
请澄清一下。
1个回答

120
在导入DLL的库文件中,.lib文件实际上没有包含任何代码。它基本上只包含相关DLL中函数的列表,足以使链接器将对该DLL的引用嵌入到与库文件链接的某些东西中,但没有其他内容。
.exp文件是导出文件,与.lib文件基本相同。它主要用于循环依赖的情况。例如,假设您有一个作为可执行文件插件的DLL。可执行文件提供一些导出函数供插件DLL使用,但也需要能够调用一些插件中的函数(例如,加载和初始化插件)。
在构建提供.lib文件的可执行文件之前,DLL无法链接 - 但在构建提供.lib文件的DLL之前,可执行文件也无法链接。为了打破这种依赖关系,您可以对可执行文件运行链接器,它会失败(因为找不到DLL的.lib文件),但会生成.exp文件。然后,您可以针对可执行文件的.exp文件链接DLL。然后,您可以重新运行链接器来生成可执行文件,使用DLL的.lib文件。

-1:非常老的答案,可能需要更新,但令人惊讶的是,它没有更全面的答案。您将-1作为ny,甚至没有提到静态与动态库链接,这意味着您错误地暗示库文件不包含函数代码(它们显然包含,因为它们是obj文件的集合——op没有限制仅限于动态链接,而且可能甚至不知道区别)。 - David
2
@David:.exp文件仅与动态链接一起使用。因此,通过询问它们,OP肯定对动态链接的讨论做出了限制。我明确说过:“在DLL的导入库的情况下[...]”你怎么认为这“甚至没有提到静态与动态库链接”?你知道“DLL”的意思是“动态链接库”,对吧?这回答了他所问的问题,而且主题的内容并没有显著改变。 - Jerry Coffin
我同意你的回答是适当的。它只是-1,因为问题从未限制它在动态情况下的使用。也许你会觉得有点严厉 - 因为显然一个专家会知道编译dll时才会产生exp文件。然而,提问者似乎不是专家,并且还问了.lib和.dll之间的区别,所以我不确定一个新手是否会意识到.lib 可以包含代码。我应该写“(静态与动态)库链接”以使其更清晰吗? - David

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接