我在VS 2005中为本机Win32 /非托管C++创建了一个DLL项目,称之为myProj.dll.这取决于第三方商业DLL,而后者依赖于msvcr90.dll(我假设它是从VS 2008项目构建的).我将其称为thirdParty.dll.
我的DLL项目在VS2005中构建得很好.我已经构建了一个链接到myProj.lib的测试应用程序(同样,VS 2005 Win32 C++).(顺便说一下,根据.lib的小尺寸来判断,并且在运行时,应用程序必须找到myProj.dll,我猜测.lib只是一个调用的包装器. loadLibrary()加载实际的DLL;是关闭吗?)
我的问题是,在运行时,测试应用程序无法找到msvcr90.dll(也不是msvcp90.dll),其依赖性来自thirdParty.dll.
我已经安装了Microsoft的redist包,所以在c:\ WINDOWS\WinSxS\x86_Microsoft.VC90.CRT _...中安装了所有std(9.0)C++库.更重要的是,如果我将依赖性walker指向thirdParty.dll,它会愉快地解析对该位置的引用.
但是,如果我将depends.exe指向我的测试应用程序(.exe)或myProj.dll,则找不到msvcr90.dll和msvcp90.dll.
我猜我需要在VS2005中配置一些东西,以便.exe或myProj.dll知道std C++库的9.0版本的位置(可能是redist包在C:\ WINDOWS\WinSxS中安装它们的位置) ),但我似乎无法弄清楚它是什么.我是在正确的轨道上吗?
我注意到,如果我只是将msvc*90.dll文件复制到我的app目录,那么依赖项就解决了,但是我得到了关于std c ++ DLL等的不正确加载的运行时错误.
非常感谢提前.
这看起来像是一个"并排组件"问题.
据我所知,微软试图阻止过去几年的DLL Hell问题引入了"并排组件"的概念.
在坚果壳中,这意味着您的应用程序需要告诉Windows它设计使用的CRT版本.安装应用程序时,Windows将确保您的应用程序获得这些DLL文件的私有副本.
要使其全部工作,您需要将应用程序的DLL依赖项嵌入到应用程序清单文件中,并使用应用程序项目设置的清单工具,输入和输出部分将其附加到项目中.
这里的示例是我用于Zeus for Windows IDE 的清单:
Zeus for Windows
最后,如果您计划制作安装程序,则需要将这些DLL文件的相同版本添加到应用程序安装程序,或者让安装程序运行Microsoft CRT可再发行组件安装程序.
FWIW我只是在用户报告Zeus因为缺少MSVCRT运行时DLL文件而不再在Windows XP上运行时发现了这一点,但Zeus已经工作了10多年而没有必须随附MSVCRT运行时DLL文件.