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

时间:2009-01-25 10:10:30

标签: c++ winapi linker

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

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

我问这个问题的原因是:当我通过导入这个dll并运行exe来构建我的exe时,exe会尝试找到dll以在进程地址空间中加载它。

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

注意:我是dumpbin libary文件(.lib),看到它不包含dll的名称。

3 个答案:

答案 0 :(得分:17)

LIB文件在EXE中变为导入表。此 包含DLL的名称。

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

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

Archive member name at 83E: MyDll.dll/      
497C3B9F time/date 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 name     : MyDll.dll
  Symbol name  : ?fnMyDll@@YAHXZ (int __cdecl fnMyDll(void))
  Type         : code
  Name type    : name
  Hint         : 2
  Name         : ?fnMyDll@@YAHXZ

答案 1 :(得分:2)

是的,lib包含DLL的名称。

从功能上讲,导入库实现LoadLibraryGetProcAdress调用,并使导出的函数可用,就像它们是静态链接一样。

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

答案 2 :(得分:0)

正如Roger和Peter指出的那样,.lib文件包含.dll文件的名称。并且感谢Roger指出dumpbin显示.dll文件的名称,这有助于我解决我的问题。这与.lib文件中的名称来自何处有关。

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