zoukankan      html  css  js  c++  java
  • 部署vc2008开发的程序(三种办法,但是我觉得这种办法最不好)

    如果你编译了一个VC2008的默认的CRT/MFC的应用程序,如果目标部署电脑上没有安装相应的VC2008的动态库,当运行你的程序的时 个,会出现如下错误信息.
     
    这是因为程序使用了基于VC2008的CRT/MFC的动态库版本.
    解决这个问题,有三种方法:
    1.使用静态链接库编译(缺点,生成的exe的程序过于庞大)
     
    2.使用vcredist_x86.exe / vcredist_x64.exe 将VC2008的发行版的DLL安装在你的系统上.(缺点,只能支持发行版,调试版程序不能支持)
     
    3.将你的程序依赖的CRT/MFC的动态库与你的程序一起发布(放在与你的发布程序同一目录中)
    第一种和第二种就不详细讲如何实现了,只要讲第三种方法如何实现.尤其是程序的开发是使用了VC2008 SP1的版本开发的程序.
    在你的VC2008的安装目录下有两个目录,
    • C:Program Files (x86)Microsoft Visual Studio 9.0VC edistx86Microsoft.VC90.CRT
    • C:Program Files (x86)Microsoft Visual Studio 9.0VC edistx86Microsoft.VC90.MFC

    只要将这两个目录下的文件一同拷贝到发布程序的同一目录下:

    Microsoft.VC90.CRT.manifest 
    msvcr90.dll 
    msvcp90.dll 
    msvcm90.dll 
    Microsoft.VC90.MFC.manifest 
    mfc90.dll 
    mfc90u.dll 
    mfcm90.dll 
    mfcm90u.dll
    这些是这个程序依赖的发行版动态库,同理,如果是调试版的发布程序,也一样把相应的调试动态库拷贝到相应目录.
    程序如你意运行起来了!
    但是,如果你安装的是VC2008 SP1的版本的时候,问题就来了,你的程序也一样运行不起来了!
    原因就是安装了VC2008 SP1的时候,它把"VC/redist"用新的版本文件代替了,问题不大,但是,这个程序的版本是依赖于新的manifest的文件的,当你编译 VC2008-SP1的程序的时候,它同时把RTM-version写入程序的manifest文件中,这个是旧的RTM-version,不与新版本的 VC2008-SP1的"CRT/MFC"manifest版本一致,因此程序运行的时候是拒绝导入这些新的VC2008-SP1的CRT/MFC的运态 库!
    解决方法有两种.
    • 方法一:
    最简单的,修改Microsoft.VC90.CRT.manifest和Microsoft.VC90.MFC.manifest文件,将新 的版本号改为旧的版本号,如果是依赖其它的Microsoft.VC90.*.manifest的文件,也同样是如此修改!
    如果是装了VC2008-SP1后,它的版本号是“9.0.21022.8″
    未装VC2008-SP1前的版本号为"9.0.21022.8"
    过程如下:
    将所依的动态库的及它们的 manifest 文件拷贝到发布应用程序的同一目录下,并修改Microsoft.VC90.*.manifest文件,将
    version="9.0.30729.1"
    修改为
    version="9.0.21022.8"
    恭喜你,你的程序运行 起来了!
    • 方法二
      修改你的程序的所依赖的manifest,这样程序会依整于新的manifest.
      过程如下:
      在stdafx.h
      这 个文件中,增加如下宏定义:
    #define _BIND_TO_CURRENT_VCLIBS_VERSION 1
    程序编译后就会依赖于新的manifest,版 本号为
    "9.0.30729.1"
    无须再修改manifest文件中的version版本号了.
    将所依的动态库的及它们的 manifest 文件拷贝到发布应用程序的同一目录下
    恭喜你,程序又运行起来了!
     
    注意:如果你是想要新的MFC-feature-pack的功能,用这种方法是最好的.
    注意一点,非常重要,如果已经安装了vcredist_*.exe程序包,注意的是Dll会自动把引用调到系统目录下的WinSxS目录下的, 即不再引用同一目录下的动态库!
    如果是编译时使用了(/clr)这个编译选项去支持.net开发,你必须要安装.net framework redistributable包!
    不过,在2010,编译的程序会不再需要manifest文件!

    http://blog.csdn.net/kl222/article/details/7546076

  • 相关阅读:
    CF 461B Appleman and Tree
    POJ 1821 Fence
    NOIP 2012 开车旅行
    CF 494B Obsessive String
    BZOJ2337 XOR和路径
    CF 24D Broken robot
    POJ 1952 BUY LOW, BUY LOWER
    SPOJ NAPTIME Naptime
    POJ 3585
    CF 453B Little Pony and Harmony Chest
  • 原文地址:https://www.cnblogs.com/findumars/p/5625553.html
Copyright © 2011-2022 走看看