部署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.0\VC\redist\x86\Microsoft.VC90.CRT
  • C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\redist\x86\Microsoft.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

时间: 2024-10-31 21:48:41

部署vc2008开发的程序(三种办法,但是我觉得这种办法最不好)的相关文章

2、struct2开发action 的三种方法以及通配符、路径匹配原则、常量

struct2 开发action 的三种方法 1.继承ActionSupport public class UserAction extends ActionSupport { // Action中业务处理方法 public String login() { System.out.println("UserAction.login()"); // return "success"; return SUCCESS; } } 2.实现Action public clas

将应用部署到Tomcat根目录的三种方法

将应用部署到Tomcat根目录的三种方法 将应用部署到Tomcat根目录的目的是可以通过"http://[ip]:[port]"直接访问应用,而不是使用"http://[ip]:[port]/[appName]"上下文路径进行访问. 方法一:(最简单直接的方法) 删除原 webapps/ROOT 目录下的所有文件,将应用下的所有文件和文件夹复制到ROOT文件夹下. 方法二: 删除原webapps/ROOT 目录下的所有文件,修改文件"conf/server

struts2开发action 的三种方法以及通配符、路径匹配原则、常量

struts2开发action 的三种方法 1.继承ActionSupport public class UserAction extends ActionSupport { // Action中业务处理方法 public String login() { System.out.println("UserAction.login()"); // return "success"; return SUCCESS; } } 2.实现Action public class

Java Web开发Tomcat中三种部署项目的方法

一般情况下,开发模式下需要配置虚拟主机,自动监听,服务端口,列出目录文件,管理多个站点等功能 准备工作: 软件包:apache-tomcat-6.0.20.rar 将软件包解压至硬盘一分区,进入%TOMCAT_HOME%/conf目录 一:server.xml 配置 1.配置端口,修改server.xml. <Connector port="80" protocol="HTTP/1.1" connectionTimeout="20000"

MVC学习之数据库开发模式:三种开发模式总结:

先介绍下三种开发模式的使用方法: 1.数据库优先: 数据库开发之:数据库优先主要步骤: 1.在数据库中建立好数据库和所需要得到表 2.选中Models文件夹,添加新项目--数据--ADO.NET实体数据模型……在生成数据库页面选着从数据库中生成 在完成2之后,会在web.config里面自动生成数据库连接字符串 3.创建控制器和对应的视图页面 4.在控制器中创建数据上下文实例对象,该对象是通过连接数据库字符串的名字来创建的. 2.代码优先: 数据库开发之代码优先步骤: 1.在Models文件夹中

vs2008下如何部署arcengine开发的程序

说实话本想搞WPF+ArcEngine开发的,环境都搭建好了,突然发现貌似有很多授权的问题,唯恐部署软件后不能在其它客户端上使用,而且是项目开发,于是决定先暂时放下这个想法,待联系做研究性系统时再予以开发使用.好了,接下来我将以图解形式详细说明一下如何部署一个arcgis二次开发程序. 所需文件 首先,我先将我们所用到的文件及搭建环境要求列一下. 客户端系统环境:win xp.win7.win8 客户端系统需要安装:dotNetFx35.WindowsInstaller3.1.ArcEngine

开发Servlet的三种方式

我们开发servlet主要有三种方法: 1:用servlet的接口. 2:继承GenericServlet 3:继承Httpservlet 第一种是比较古老的方法,既然定义了接口,那么就要去显现其下面的的五个方法. 第二种是相当于把servle的接口方法封装好的.只要实现一个方法就可以. 第三种相比第二种也更为强大,也最常用 在部署好servlet的前提下,实例代码如下: 1: package com_1; import javax.servlet.*; import javax.servlet

Java Web -- Servlet(4) 开发Servlet的三种方法、配置Servlet详解、Servlet的生命周期(1)

一.实现Servlet接口 通过实现Servlet接口来了解Servlet的生命周期 (1)以规范的形式创建一个web应用(即在webapps目录下创建一个web应用) 创建web应用 (2)classes目录下创建一个.java(该java文件为实现Servlet接口) 创建文件夹MyFirstServlet.java 代码如下: package com.focus; import javax.servlet.*; import javax.servlet.http.*; import jav

Java Web -- Servlet(5) 开发Servlet的三种方法、配置Servlet详解、Servlet的生命周期(2)

三.Servlet的生命周期 一个Java servlet具有一个生命周期,这个生命周期定义了一个Servlet如何被载入并被初始化,如何接收请求并作出对请求的响应,如何被从服务中清除.Servlet的生命周期被javax.servlet.Servlet这个接口所定义. 所有的Java Servlet都会直接地或间接地执行javax.servlet.Servlet接口,这样它才能在一个Servlet引擎中运行. Servlet引擎是Web 服务器按照Java Servlet API定制的扩展.S