release程序无法执行,MSVCP80.dll is missing

   今天把opencv里的grabcut程序拿来想跑一下,编译没有问题,没想到release版本运行时遇到 MSCVP80.dll is missing的问题。网上找了一通,说是manifest的问题。然后就去release版本的工程属性->linker->manifest file->Generate manifest 中是Yes。所以说工程配置是有manifest file的。跑去vs8的安装目录,找到vc->redist->x86->Microsoft.VC80.CRT,里边有MSCVP80.dll和manifest文件。打开manifest文件,是如下内容:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    <noInheritable></noInheritable>
    <assemblyIdentity type="win32" name="Microsoft.VC80.CRT" version="8.0.50727.762" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
    <file name="msvcr80.dll" hash="10f4cb2831f1e9288a73387a8734a8b604e5beaa" hashalg="SHA1"><asmv2:hash xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:dsig="http://www.w3.org/2000/09/xmldsig#"><dsig:Transforms><dsig:Transform Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity"></dsig:Transform></dsig:Transforms><dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"></dsig:DigestMethod><dsig:DigestValue>n9On8FItNsK/DmT8UQxu6jYDtWQ=</dsig:DigestValue></asmv2:hash></file>
    <file name="msvcp80.dll" hash="b2082dfd3009365c5b287448dcb3b4e2158a6d26" hashalg="SHA1"><asmv2:hash xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:dsig="http://www.w3.org/2000/09/xmldsig#"><dsig:Transforms><dsig:Transform Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity"></dsig:Transform></dsig:Transforms><dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"></dsig:DigestMethod><dsig:DigestValue>0KJ/VTwP4OUHx98HlIW2AdW1kuY=</dsig:DigestValue></asmv2:hash></file>
    <file name="msvcm80.dll" hash="542490d0fcf8615c46d0ca487033ccaeb3941f0b" hashalg="SHA1"><asmv2:hash xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:dsig="http://www.w3.org/2000/09/xmldsig#"><dsig:Transforms><dsig:Transform Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity"></dsig:Transform></dsig:Transforms><dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"></dsig:DigestMethod><dsig:DigestValue>YJuB+9Os2oxW4mY+2oC/r8lICZE=</dsig:DigestValue></asmv2:hash></file>
</assembly>

   再打开编译生成好的manifest的中间文件grabcut.exe.intermediate.manifest,内容如下:

<?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' />
      </requestedPrivileges>
    </security>
  </trustInfo>
</assembly>

   可以看到,这两个文件很不一样。而且,在实际生成的manifest里,没有版本等信息。看manifest的文件格式,也就是没有dependency。于是,跑去release工程属性对话框中,找到linker->manifest file->additional manifest dependencies,是空的,难怪生成的manifest文件中没有版本信息,所以才找不到系统里的 Microsoft.VC80.CRT及MSVC80P.dll。但是又不知道在这里怎么添加dependency,所以又去网上找,最后在官网上找到一个在程序源文件中添加 pragma的方法。将下列语句加入文件即可:

#pragma comment(linker, "\"/manifestdependency:type='Win32' name='Microsoft.VC80.CRT' version='8.0.50727.762' processorArchitecture='X86' publicKeyToken='1fc8b3b9a1e18e3b' language='*'\"")

  再编译运行就可以了。

  另外,http://msdn.microsoft.com/en-us/library/y0zzbyt4.aspx 有很详细的VS的链接器的设置,当然还可以找到其他工程属性的设置。


posted @ 2013-03-11 06:33  Liqun Liu  阅读(475)  评论(0编辑  收藏  举报