【问题标题】:When building a DLL file, does the generated LIB file contain the DLL name?构建DLL文件时,生成的LIB文件是否包含DLL名称?
【发布时间】:2009-01-25 10:10:29
【问题描述】:

在 Visual C++ 中,当我构建一个 dll 时,输出文件是 .dll 和 .lib。

是 .lib 文件中内置的 dll 的名称。

我问这个问题的原因是:当我通过导入这个 dll 构建我的 exe 并运行该 exe 时,该 exe 尝试定位 dll 以将其加载到进程地址空间中。

由于我们只是在项目属性中指定库名称(.lib 文件),exe 是如何知道 dll 的名称的。

注意:我转储了库文件 (.lib),发现它不包含 dll 的名称。

【问题讨论】:

    标签: c++ winapi linker


    【解决方案1】:

    LIB 文件在 EXE 中变成导入表。这确实包含 DLL 的名称。

    如果您运行dumpbin /all MyDLL.lib,您可以看到这一点。请注意,dumpbin MyDll.lib 本身并没有显示任何有用的信息:您应该使用 /all

    这显示了 .LIB 文件中定义的所有部分。您可以忽略任何 .debug 部分,因为它们不会出现在发布版本中。在 .LIB 文件中,有一组 .idata 节。在我刚刚构建的 DLL 项目中,LIB 文件包含一个 .idata$4 部分,它定义了要放入 EXE 的导入表中的符号,包括 DLL 名称:

    在 83E 处存档成员名称:MyDll.dll/
    497C3B9F 时间/日期 Sun Jan 25 10:14:55 2009
             uid
             吉德
           0 模式
          2E尺寸
    正确的标题结束
    
      版本:0
      机器:14C (x86)
      时间日期戳:497C3B9F 2009 年 1 月 25 日星期日 10:14:55
      数据大小:0000001A
      DLL 名称:MyDll.dll
      符号名称:?fnMyDll@@YAHXZ (int __cdecl fnMyDll(void))
      类型:代码
      姓名类型:姓名
      提示:2
      名称:?fnMyDll@@YAHXZ

    【讨论】:

    • 是的,exe 的导入部分包含 dll 的名称。但正如你所说,它会从库中知道名称。那么,您的意思是库包含名称吗?如果是,为什么我在转储库时没有看到。
    • ...因为您没有正确运行 DUMPBIN?通过 /ALL 开关,然后您应该会看到类似于我所包含的输出。
    • 谢谢。我现在明白了。
    【解决方案2】:

    是的,lib 包含 DLL 的名称。

    在功能上,导入库实现了LoadLibraryGetProcAdress 调用,并使导出的函数像静态链接一样可用。

    搜索路径与 LoadLibrary 记录的相同,但名称是固定的。

    【讨论】:

      【解决方案3】:

      正如 Roger 和 Peter 所指出的,是的,.lib 文件包含 .dll 文件的名称。感谢 Roger 指出 dumpbin 显示了 .dll 文件的名称,这帮助我解决了我的问题。这与 .lib 文件中的名称的来源有关。

      我希望从 dll 项目的项目设置中获取名称,但我们有一个 export.def,它指定了 dll 的名称。因此,当我更改项目设置而不是 export.def 时,我们在使用 dll 时遇到了问题。我们项目的解决方案是清除 export.def 文件。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-21
        • 1970-01-01
        相关资源
        最近更新 更多