代码之家  ›  专栏  ›  技术社区  ›  LeopardSkinPillBoxHat

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

  •  3
  • LeopardSkinPillBoxHat  · 技术社区  · 14 年前

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

    系统无法执行指定的程序

    我立即想到这是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>
    

    好像有两份 Microsoft.VC80.DebugCRT 其中的依赖程序集。

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

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

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

    是什么导致此依赖项添加到清单中?我猜这与另一个DLL有关,我的应用程序依赖于另一台PC上使用另一组可重新分发的DLL,但我想确认这一点。

    更新:

    我试过很多建议 this blog post 没有很多运气。有一件事很奇怪,在我进行发布构建时生成的清单不包括8.0.50727.4053条目,但调试构建包含。

    1 回复  |  直到 9 年前
        1
  •  1
  •   Igor    14 年前

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

    正如我现在一样,VS C++没有扫描依赖关系,所以清单是从核心VS生成的(您可以通过项目设置手动控制它)。我认为vs更新是安装在开发PC上的,所以vs反映在清单中。