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

  • 相关阅读:
    使用MobaXterm远程连接Ubuntu,启动Octave,界面不能正常显示
    ABP .Net Core 日志组件集成使用NLog
    ABP .Net Core Entity Framework迁移使用MySql数据库
    ABP前端使用阿里云angular2 UI框架NG-ZORRO分享
    阿里云 Angular 2 UI框架 NG-ZORRO介绍
    Visual Studio 2019 Window Form 本地打包发布猫腻
    VS Code + NWJS(Node-Webkit)0.14.7 + SQLite3 + Angular6 构建跨平台桌面应用
    ABP .Net Core 调用异步方法抛异常A second operation started on this context before a previous asynchronous operation completed
    ABP .Net Core To Json序列化配置
    .Net EF Core数据库使用SQL server 2008 R2分页报错How to avoid the “Incorrect syntax near 'OFFSET'. Invalid usage of the option NEXT in the FETCH statement.”
  • 原文地址:https://www.cnblogs.com/findumars/p/5625553.html
Copyright © 2011-2022 走看看