在Visual C ++中,当我构建一个dll时,输出文件是.dll和.lib。
是否在.lib文件中内置了dll的名称。
我问这个问题的原因是:当我通过导入这个dll并运行exe来构建我的exe时,exe会尝试找到dll以在进程地址空间中加载它。
由于我们只是在项目属性中指定库名(.lib文件),exe如何知道dll的名称。
注意:我是dumpbin libary文件(.lib),看到它不包含dll的名称。
答案 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的名称。
从功能上讲,导入库实现LoadLibrary
和GetProcAdress
调用,并使导出的函数可用,就像它们是静态链接一样。
搜索路径与LoadLibrary记录的相同,但名称是固定的。
答案 2 :(得分:0)
正如Roger和Peter指出的那样,.lib文件包含.dll文件的名称。并且感谢Roger指出dumpbin显示.dll文件的名称,这有助于我解决我的问题。这与.lib文件中的名称来自何处有关。
我希望从dll项目的项目设置中获取名称,但我们有一个export.def,它指定了dll的名称。因此,当我更改项目设置而不是export.def时,我们在使用dll时遇到了问题。我们项目的解决方案是清除export.def文件。