【问题标题】:Visual Studio DLL project with DLL dependencies, unresolved external symbols具有 DLL 依赖项、未解析的外部符号的 Visual Studio DLL 项目
【发布时间】:2011-12-22 04:12:47
【问题描述】:

我是 Windows 概念的新手。我正在尝试开发一个动态链接到其他 DLL 的 DLL。我正在使用 Visual Studio 2010。在链接时,Visual Studio 告诉我它正在尝试链接一堆 .lib 文件。如果我希望我的代码执行动态链接,我认为 Visual Studio 不应该尝试读取任何 .LIB 文件,对吗?还是我对.LIB文件的使用理解不够?

谢谢

【问题讨论】:

    标签: visual-studio-2010 dll


    【解决方案1】:

    我的理解是,您有点困惑,因为您想使用 DLL 而不是 LIB。

    诀窍在于 Kernel32.Lib、User32.Lib、AdvAPI32.Lib 等没有实现您使用的功能。此外,如果您在程序中使用CreateFileWMessageBoxW 之类的函数,则编译后对函数的引用将无法解析。因此,如果没有 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_Tablehttp://msdn.microsoft.com/en-us/library/ms809762.aspxhttp://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

    【讨论】:

      【解决方案2】:

      我记得,Visual Studio 的编译器通过链接存根 .LIB 文件来解析 .DLL 文件。

      检查,其中一个应该是 kernel32.lib。

      【讨论】:

      • 是的,它检查 kernel32.lib 和其他各种。但是我有我正在编译/链接的外部依赖库。它也想要那些 .lib 文件。我确实有这些 .lib 文件,但我不希望它执行静态链接,我认为它正在执行动态链接......我确定有一个标志/设置可以检查以确保我的项目是执行动态链接...你知道那个设置/标志是什么吗?
      • 链接类型由链接的 .lib 文件类型定义。那是静态的.lib 还是动态的lib?很容易看出,静态 .lib 与 .dll 相比非常小。
      猜你喜欢
      • 2022-08-03
      • 1970-01-01
      • 2013-05-04
      • 1970-01-01
      • 1970-01-01
      • 2011-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多