Chinaunix首页 | 论坛 | 博客
  • 博客访问: 213330
  • 博文数量: 67
  • 博客积分: 3156
  • 博客等级: 中校
  • 技术积分: 650
  • 用 户 组: 普通用户
  • 注册时间: 2009-05-18 17:41
个人简介

软件工程师!

文章分类

全部博文(67)

文章存档

2015年(1)

2014年(1)

2012年(6)

2011年(16)

2010年(31)

2009年(12)

分类: C/C++

2010-04-24 16:45:59

CSDN博客 http://blog.csdn.net/laiboy

ChinaUnix博客 http://laiboy.cublog.cn

在上一篇"部署VC2008应用程序 "中,我谈到过,如果安装了vcredist_x86.exe / vcredist_x64.exe 这两个发布包后,即使使用CRT/MFC和manifest的文件与应用程序放在同一目录下,也不会调用,会调用已安装的vcredist_x86.exe / vcredist_x64.exe 的CRT/MFC运行时库.

如果是调试版或安装的vcredist_x86/vcredist_x64已你机子上安装的VC2008不一致(例如是使用了SP1),应用程序仍然是不能正确运行的了.

解决的方法就是要求应用程序不再依赖vcredist_x86/vcredist_x64这两个包

解决方法如下:

1.删除生成的manifest,并修改生成manifest的方式

设置 Project->Properties->Configuration Properties->Manifest Tool->Input and Output->Embed Manifests: No

(中文版VC2008修改如下 项目->属性->配置属性->清单工具->输入和输出->嵌入清单:否)

2.重编译程序

3.将生成的程序和manifest拷贝到部署目录

4.打开manifest文件(appname.exe.manidfest),将所有的"MFC/CRT/ATL/OpenMP"的节点的"publicKeyToken"删除, 意,"Microsoft.Windows.Common-Controls"这个节点的"publicKeyToken"不要删除

5.将所"%ProgramFiles%\Microsoft Visual Studio 9.0\VC\redist\x86"所依赖的目录都拷贝到部署目录

6."Microsoft.VC90.CRT","Microsoft.VC90.MFC","Microsoft.VC90.ATL","Microsoft.VC90.OPENMP","Microsoft.VC90.MFCLOC"等这些目录拷贝到部署目录后(注,所依赖的,不必全部拷贝),将这些依赖的目录下的manifest文件中的"publicKeyToken",全部删除

7.修改manifest的版本号,要与所安装的VC2008版本一致("9.0.21022.8"为普通版本"9.0.30729.1"为SP1版本)

至此,我们的工作已经完成,程序可以任何安装了或不安装的vcredist_x86和vcredist_x64的机子上运行了!因为应用程序只依赖了编译机子上的CRT/MFC

 

阅读(1365) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~