需要深入了解如何为C ++程序生成清单

时间:2010-02-09 05:50:37

标签: c++ windows manifest side-by-side dll

当我运行我构建的可执行文件时,出现以下错误:

  

系统无法执行指定的程序

我的直接想法是,它是一个VC8.0可重新分发的DLL(msvcr80d.dll等)的依赖问题。我们遇到一些问题,这些DLL的修补版本会影响我们的程序。

当我在Dependency Walker下打开我的可执行文件时,会显示以下错误:

Error: The Side-by-Side configuration information in "w:\MYPROGRAM.EXE.manifest" 
       contains errors. This application has failed to start because the
       application configuration is incorrect. Reinstalling the application may
       fix this problem (14001).
Warning: At least one delay-load dependency module was not found.
Warning: At least one module has an unresolved import due to a missing export
         function in a delay-load dependent module.

如果我打开可执行文件的清单文件,其中包含以下内容:

<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type='win32' name='Microsoft.VC80.DebugCRT' version='8.0.50727.762' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />
    </dependentAssembly>
  </dependency>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type='win32' name='Microsoft.VC80.DebugCRT' version='8.0.50727.4053' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />
    </dependentAssembly>
  </dependency>
</assembly>

它似乎有2个Microsoft.VC80.DebugCRT依赖程序集的副本。

程序集的8.0.50727.4053版本不是我的并排配置(我相信这个版本附带了一个未安装的Visual Studio补丁)。

如果我从清单文件中删除此程序集,则可执行文件可以正常运行。

但是,当我重新构建我的应用程序时,会重新生成清单并再次添加额外的依赖项。

是什么原因导致将此依赖项添加到清单?我猜它与另一个DLL有关,我的应用程序依赖于在另一台具有不同可重新分发的DLL的PC上构建,但我想证实这一点。

更新

我在this blog post尝试了很多建议,没有太多运气。有一点奇怪的是,当我执行Release版本时生成的清单不包括8.0.50727.4053条目,但是Debug版本会生成。

1 个答案:

答案 0 :(得分:1)

你是对的。 Visual C ++ 2005 SP1的安全更新强制您的应用程序使用较新版本的CRT和MFC(8.0.50727.4053而不是8.0.50727.762)。因为它可能兼容,所以最好使用新的。您应该使用您的应用程序分发vcredist_x86.exe。

就像我现在一样,VS C ++不会扫描依赖项,因此清单是从核心VS生成的(您可以通过项目设置手动控制它)。我确实在开发PC上安装了VS更新,因此VS会在清单中反映出来。