【发布时间】:2011-12-22 04:12:47
【问题描述】:
我是 Windows 概念的新手。我正在尝试开发一个动态链接到其他 DLL 的 DLL。我正在使用 Visual Studio 2010。在链接时,Visual Studio 告诉我它正在尝试链接一堆 .lib 文件。如果我希望我的代码执行动态链接,我认为 Visual Studio 不应该尝试读取任何 .LIB 文件,对吗?还是我对.LIB文件的使用理解不够?
谢谢
【问题讨论】:
我是 Windows 概念的新手。我正在尝试开发一个动态链接到其他 DLL 的 DLL。我正在使用 Visual Studio 2010。在链接时,Visual Studio 告诉我它正在尝试链接一堆 .lib 文件。如果我希望我的代码执行动态链接,我认为 Visual Studio 不应该尝试读取任何 .LIB 文件,对吗?还是我对.LIB文件的使用理解不够?
谢谢
【问题讨论】:
我的理解是,您有点困惑,因为您想使用 DLL 而不是 LIB。
诀窍在于 Kernel32.Lib、User32.Lib、AdvAPI32.Lib 等没有实现您使用的功能。此外,如果您在程序中使用CreateFileW 或MessageBoxW 之类的函数,则编译后对函数的引用将无法解析。因此,如果没有 LIB,未解析的引用也将保留在 EXE 中。那将是不好的原因。要可执行,EXE 必须解析所有外部引用,并且准确地知道应该在哪些 DLL 中找到哪些函数。所以命名为import library有助于解决问题。例如,导入库 Kernel32.Lib 包含有关 CreateFileW 函数的信息,而 User32.Lib 包含有关 MessageBoxW 的信息。如果您使用 Kernel32.Lib、User32.Lib、AdvAPI32.Lib 等导入库列表,则您的 EXE 将解析所有引用并在特殊的 导入表(参见http://en.wikipedia.org/wiki/Portable_Executable#Import_Table、http://msdn.microsoft.com/en-us/library/ms809762.aspx 和http://www.microsoft.com/whdc/system/platform/firmware/pecoff.mspx)。因此,如果启动您的 EXE,操作系统会将 DLL 加载到进程的地址空间中,并解析到最后所有使用的函数的地址。
通常,在编译 DLL 时,链接器 (link.exe) 会创建导入库。也可以创建一个与 lib.exe 实用程序相关的 DLL 对应的导入库。 (见http://msdn.microsoft.com/en-us/library/0b9xe492.aspx)
【讨论】:
我记得,Visual Studio 的编译器通过链接存根 .LIB 文件来解析 .DLL 文件。
检查,其中一个应该是 kernel32.lib。
【讨论】: