首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >VS 2005 C++项目中的msvcr90.dll依赖项

VS 2005 C++项目中的msvcr90.dll依赖项
EN

Stack Overflow用户
提问于 2008-12-01 22:33:07
回答 4查看 8K关注 0票数 7

我已经在VS2005中为本地win32/非托管C++创建了一个动态链接库项目,称为myProj.dll。它依赖于第三方商业DLL,而商业DLL又依赖于msvcr90.dll (我假设它是从VS2008项目构建的)。我会叫它thirdParty.dll。

我的DLL项目在VS2005中构建得很好。我已经构建了一个链接到myProj.lib的测试应用程序(同样是VS2005 Win32 C++)。(顺便说一句,根据.lib的小尺寸以及应用程序在运行时必须定位myProj.dll的事实,我猜测.lib只是一个包装,用于调用加载实际DLL的loadLibrary();这是不是很接近?)

我的问题是,在运行时,测试应用程序不能定位msvcr90.dll (也不能定位msvcp90.dll),它依赖于thirdParty.dll。

我已经安装了微软的redist包,也安装了c:\WINDOWS\WinSxS\x86_Microsoft.VC90.CRT_中的所有std (9.0) C++库...。更重要的是,如果我将依赖项遍历程序指向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文件复制到我的应用程序目录,那么依赖关系就解决了,但是我得到了关于不正确加载std c++ DLL等的运行时错误。

事先非常感谢。

EN

回答 4

Stack Overflow用户

发布于 2008-12-01 23:04:18

在我看来,这是一个“并行程序集”的问题。

据我所知,微软试图阻止过去几年的DLL地狱问题,引入了“并排汇编”的概念。

简而言之,这意味着你的应用程序需要告诉Windows它被设计用于CRT的哪个版本。安装应用程序后,Windows将确保您的应用程序获得这些DLL文件的自己的私有副本。

要使这一切正常工作,您需要将应用程序的DLL依赖项嵌入到应用程序和清单文件中,并使用应用程序项目设置的清单工具Input Output部分将其附加到项目。

下面是我在Zeus for Windows集成开发环境中使用的清单:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <assemblyIdentity
      name="Xidicone.Windows.Zeus for Windows"
      version="3.9.6.69"
      processorArchitecture="X86"
      type="win32" />

  <description>Zeus for Windows</description>

  <dependency>
    <dependentAssembly>
      <assemblyIdentity
            type="win32"
            name="Microsoft.VC80.CRT"
            version="8.0.50608.0"
            processorArchitecture="x86"
            publicKeyToken="1fc8b3b9a1e18e3b" />
    </dependentAssembly>
  </dependency>

  <dependency>
    <dependentAssembly>
      <assemblyIdentity
          type="win32"
          name="Microsoft.Windows.Common-Controls"
          version="6.0.0.0"
          processorArchitecture="X86"
          publicKeyToken="6595b64144ccf1df"
          language="*" />
    </dependentAssembly>
  </dependency>
</assembly>

最后,如果您计划制作安装程序,则需要将这些DLL文件的相同版本添加到应用程序安装程序中,或者让您的安装程序运行Microsoft CRT可再发行安装程序。

FWIW我只是在一位用户报告说Zeus不再在Windows XP上运行时才发现了这一点,因为Zeus已经正常工作了10多年,从来没有一次需要附带MSVCRT运行时DLL文件。

票数 6
EN

Stack Overflow用户

发布于 2008-12-01 22:43:25

你安装msvc 2008 redist的SP1 version了吗?

如果depends.exe找不到msvcr90.dll,这不是问题,如果你使用微软安装程序,它会自动安装在正确的位置,如果你的应用程序正在运行,它会被找到。如果不创建清单,则将dll复制到应用程序目录中不会有任何帮助。

但是你能说出你得到的确切的错误信息吗?

您还可以查看有关清单的herehere

票数 2
EN

Stack Overflow用户

发布于 2008-12-01 22:41:12

我会向第三方dll人员询问这一点。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/332473

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档