在Windows环境中
当我尝试将DLL链接到我的程序显式(使用LoadLibrary)时,
当我尝试将DLL链接到我的程序时隐式(使用头文件)
然后它需要使用DLL生成的相关Lib
文件。
我的问题是
Lib
文件? DLL
或Header file
获取?我已经走过了this问题。但我无法理解任何有价值的理由。 请,有人可以用简单的方式帮助解释这个问题。谢谢。
答案 0 :(得分:3)
为什么隐式链接需要Lib文件。
.libs具有dll的导入信息,您可以使用Windows / Visual Studio SDK中包含的dumpbin
命令检查信息。
这是ws2_32.lib中recv的链接信息,例如:
Version : 0
Machine : 14C (x86)
TimeDateStamp: 4907F6ED Wed Oct 29 01:38:53 2008
SizeOfData : 00000014
DLL name : WS2_32.dll
Symbol name : _recv@16
Type : code
Name type : ordinal
Ordinal : 16
您可以检查ws2_32.dll中的序号和名称(检查现在它是否导致导入DLL)。
从“Lib”文件中检索无法从DLL或头文件中获取的信息
在头文件中,没有提取导入的信息,所以在编译时它们被标记为imports(__imp__name),当它与.lib链接时,它会解析名称:
如果问题2存在问题,那么在显式加载时如何检索这些信息。
如果显式加载意味着LoadLibrary,那么您在运行时而不是在链接时告诉它。因此,PE加载程序将搜索PATH内的DLL并动态加载它。然后你有其他函数来获取导出的函数地址。
如果您不明白某事,请问我,尝试使用dumpbin并阅读有关PE的内容,如果您想更好地理解这一点。
答案 1 :(得分:1)
隐式链接时,函数声明指定要在程序中使用的名称,以及原型和调用约定。但是需要更多信息。具体做法是:
一些语言设计者选择使用语言扩展来提供此信息。例如德尔福采取这种方式。隐式链接完全在没有.lib文件的代码中指定。另一方面,C和C ++的约定是使用.lib文件来指定缺少的信息。