构建DLL文件时,生成的LIB文件是否包含DLL名称?

14
在Visual C++中,当我构建dll时,输出文件是.dll和.lib。
问:构建的dll名称是否嵌入到.lib文件中?
我提出这个问题的原因是:当我通过导入此dll来构建我的exe并运行exe时,exe会尝试定位该dll以在进程地址空间中加载它。
因为我们只在项目属性中指定库名称(.lib文件),那么exe如何知道dll的名称。
注意:我使用dumpbin工具转储了库文件(.lib),发现它不包含dll的名称。
3个回答

21

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
         gid
       0 mode
      2E size
correct header end
Version : 0 Machine : 14C (x86) TimeDateStamp: 497C3B9F Sun Jan 25 10:14:55 2009 SizeOfData : 0000001A DLL名称 : MyDll.dll 符号名称 : ?fnMyDll@@YAHXZ (int __cdecl fnMyDll(void)) 类型 : 代码 名称类型 : 名称 Hint : 2 名称 : ?fnMyDll@@YAHXZ

是的,exe的导入部分包含dll的名称。 但它从库中获取名称,就像你所说的一样。那么,你的意思是库包含名称。如果是的话,为什么我在转储库时看不到呢? - Rakesh Agarwal
...因为你没有正确运行DUMPBIN吗?传递/ALL开关,然后你应该会看到类似我所包含的输出。 - Roger Lipscombe
谢谢。我现在理解了这个概念。 - Rakesh Agarwal

2
是的,库文件包含了 DLL 的名称。
从功能上讲,导入库实现了 LoadLibraryGetProcAdress 函数调用,并使得导出的函数可以像静态链接一样可用。
搜索路径与 LoadLibrary 文档中记录的相同,但名称是固定的。

0
正如Roger和Peter所指出的,是的,.lib文件包含.dll文件的名称。感谢Roger指出dumpbin显示.dll文件的名称,这帮助我解决了我的问题。这与.lib文件中的名称来自何处有关。
我原本期望该名称从dll项目的项目设置中获取,但我们有一个export.def文件,指定了dll的名称。因此,当我更改了项目设置但未更改export.def文件时,我们使用dll时遇到了问题。我们项目的解决方案是删除export.def文件。

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