8

我正在使用带有 64 位插件的 64 位操作系统 windows 7 终极机器 VS2008。

我已经成功地在 32 位和 64 位、调试和发布配置中构建了我的项目。64 位调试未启动;它给出了错误:

无法启动程序 xxx 此应用程序无法启动,因为应用程序配置不正确。查看清单文件以了解可能的错误。重新安装应用程序可能会解决此问题。有关更多零售,请参阅应用程序事件日志。

我运行了依赖步行器。从可再分发路径 C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\redist\Debug_NonRedist\amd64\Microsoft.VC90.DebugCRT 我添加了 Microsoft.VC90.DebugCRT.manifest msvcm90d msvcp90d msvcr90d Microsoft.VC90.DebugOpenMP vcomp90d。 sll 在我的解决方案的 bin\debug 文件夹中。

最后依赖walker没有留下任何黄色标记(丢失文件),但它仍然给出了如下错误:

错误:未找到至少一个必需的隐式或转发依赖项。错误:由于隐式依赖模块中缺少导出函数,至少一个模块具有未解析的导入。错误:发现具有不同 CPU 类型的模块。错误:“e:\xyz.EXE”中的并排配置信息包含错误。应用程序无法启动,因为它的并排配置不正确。请查看应用程序事件日志或使用命令行 sxstrace.exe 工具了解更多详细信息 (14001)。

32位清单说:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel level="asInvoker" uiAccess="false"></requestedExecutionLevel>
      </requestedPrivileges>
    </security>
  </trustInfo>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type="win32" name="Microsoft.VC90.DebugCRT" version="9.0.21022.8" **processorArchitecture="x86"** publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
    </dependentAssembly>
  </dependency>
</assembly>

而 64 位调试清单具有:

 <dependency>
    <dependentAssembly>
      <assemblyIdentity type="win32" name="Microsoft.VC90.DebugCRT" version="9.0.21022.8" processorArchitecture="amd64" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
    </dependentAssembly>
  </dependency>

我不明白的是,为什么调试 32 位构建运行成功?

请帮助我,因为我已经检查了很多问题,但还没有找到任何可行的解决方案。

4

4 回答 4

6

谢谢你回答我的问题。我终于解决了,这是解决方案:-

我的是基于 Qt 的 VC++ 解决方案,该应用程序依赖于一些 3rd 方 dll 和库。我的任务是为我在 64 位操作系统中构建 Qt 和第 3 方 dlls&libs 的应用程序提供 64 位支持。

当我尝试在调试 64 位配置中运行我的应用程序时出现 CRT 错误。即使在我将以下 CRT 复制到我的应用程序的 bin 文件夹后,错误仍然存​​在

redist\Debug_NonRedist\amd64\Microsoft.VC90.DebugCRT

  1. Microsoft.VC90.DebugCRT.manifest
  2. msvcm90d.dll
  3. msvcp90d.dll
  4. msvcr90d.dll

Microsoft.VC90.DebugOpenMP

  1. vcomp90d.dll

当我将上述 CRT 粘贴到存在 Qt 和 3rd 方库的相应 bin 文件夹中时,我能够在调试 64 位模式下成功启动我的应用程序。

于 2012-02-01T11:02:16.657 回答
2

在我的 Delphi 控制台应用程序(32 位,在 Win7 x64 上运行时出现问题)添加“特权提升”清单后,我遇到了同样的问题。该问题与清单文件中提到的依赖项有关:

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

当我从清单中删除它时,并排错误消失了。

于 2012-09-21T12:45:03.640 回答
1

Depends 对于并行依赖项不是很好,因为它通常可以使它看起来像是在实际上需要稍微不同的版本时找到了 dll。

您可以使用 sxstrace.exe 更好地了解缺少的内容:

http://blogs.msdn.com/b/junfeng/archive/2006/04/14/576314.aspx

事件日志通常会显示并排错误,但遗憾的是,除了您遇到问题之外,这些错误并没有为您提供太多信息。

于 2012-01-24T09:30:56.727 回答
0

安装 VS2008 SP1来解决这个问题。

  • 安装之前,请确保在正确安装 Visual Studio 时选择了“64 位编译器和工具”功能。(如果您在安装 SP1 之后安装它,您可能需要卸载并重新安装 SP 才能获得修复。)

  • 要检查您是否安装了 SxS 条目,请查看是否有名称类似于amd64_microsoft.vc90.debugcrt*in的目录%WinDir%\WinSxS


原因是 VS2008 安装程序中的一个错误。它仅将 DebugCRT 的 32 位版本安装到<Windows>\WinSxS所有程序都可以找到它的缓存中。它确实安装了相同的 DLL,%ProgramFiles%但程序在那里找不到它们。

虽然包含 x64 DebugCRT共享程序集组件的功能是“广告”而不是出于某种原因安装。这可以在 VS2008 安装%Temp%程序留下的安装日志中通过搜索“ DebugCRT”来查看。相同的文件确实存在于c:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\redist\Debug_NonRedist(作为另一个组件的一部分),但不会复制到WinSxS.

(通过查看Orcavs_setup.msi的内容,最可能的直接原因似乎是隐藏的功能条目缺少flag,这导致它们永远不会被安装。)msidbFeatureAttributesFollowParent

无论是什么原因,VS2008 SP1 都会修复它。它的安装有一个副作用:它还会强制安装许多其他在 VS2008 安装期间可能选择或未选择的功能(例如 MFC/ATL 运行时),但与损坏的安装相比,这带来的不便要小得多。

于 2018-04-08T23:18:21.693 回答