Chinaunix首页 | 论坛 | 博客
  • 博客访问: 845968
  • 博文数量: 756
  • 博客积分: 40000
  • 博客等级: 大将
  • 技术积分: 4980
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-13 14:40
文章分类

全部博文(756)

文章存档

2011年(1)

2008年(755)

我的朋友

分类:

2008-10-13 16:10:39

    这两天有点焦头烂额, 我们这边运行的好好的程序, 到了测试的机器上就不能启动(是根本运行不了, 而不是运行出错), 弄得我异常郁闷. 经过了一番摸索, 发现和winxp、win2003中为解决dll hell而引入的manifest机制有关系. 而以前我们用vs2003开发, 它并没有强制程序使用manifest, 但到了vs2005中, 这已经改成必需的了, 而我们并没有按照需要进行相关的配置, 所以程序启动不了了. 根据目前的经验, vs2005编译的程序不能启动大致有两个原因, 下面简单介绍解决办法.
1. 在开发组的机器上(安装有vs2005)有时都不能启动
    这一般是项目的文件被放在了fat/fat32分区上导致的, 解决方法是把它们都移动到ntfs分区上, 或者把“项目属性|Manifest Tool|General|Use FAT32 Work-around”设为yes.
2. 开发组运行正常, 换到其它机器上就不行了
    这一般就是系统dll(包括crt,mfc,atl等)没有正确配置导致的. 如果程序是release版, 那么很简单, 只要把“\SDK\v2.0\BootStrapper\Packages\vcredist_x86”下的"vcredist_x86.exe"拷贝到目标机器上运行即可, 这是以x86平台为例的, 如果你用的是别的cpu平台(amd64或ia64)把x86替换成相应的内容就可以了.
    如果是debug版, 就复杂一些了, 首先要确定你需要的dll的版本, 绝大多数(注意:不是"所有")情况下它和编译器的版本相同, 通过vs2005的关于对话框就能看到, 如下图所示:
确定版本后, 在开发组的机器上进入“%windir%\winsxs"文件夹(下面将以x86平台8.0.50727.762版本的debug crt为例进行说明), 拷贝以下文件到目标机器的相同位置即可:
 
x86_Microsoft.VC80.DebugCRT_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_5490cd9f文件夹下的所有文件

Manifests文件夹下的x86_Microsoft.VC80.DebugCRT_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_5490cd9f.cat和x86_Microsoft.VC80.DebugCRT_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_5490cd9f.manifest

Policies\x86_policy.8.0.Microsoft.VC80.DebugCRT_1fc8b3b9a1e18e3b_x-ww_09e017b4文件夹下的8.0.50727.762.cat和 8.0.50727.762.policy

    注意, 上面的操作只是在目标操作系统为winxp,win2003及以上时才需要的, 如果是win2000及以下的系统, 只要把第一个文件夹下的文件拷贝到system32中就行了.

附:

msdn上有关vc应用程序部署的几片文章, 供参考




以下是与这个问题相关的一些系统提示信息, 为了让碰到这些问题的人更容易搜到这篇文章, 我把它们列在这里.
参照的汇编没有安装在系统上
应用程序要求的组件版本同另一个活动的组件有冲突。
系统无法执行指定的程序
ERROR_SXS_ASSEMBLY_NOT_FOUND
14003
0x800736B3
The referenced assembly is not installed on your system.

posted on 2007-01-31 16:34 局部变量 阅读(2156)   

 re: vs2005编译的程序不能运行的几个解决方法 2007-01-31 21:49


效率挺高~

 呵呵,玻璃兄之邀,岂能怠慢 2007-02-01 08:26

rt

 re: vs2005编译的程序不能运行的几个解决方法 2007-02-01 16:52

不错!谢谢你的文章

 re: vs2005编译的程序不能运行的几个解决方法 2007-02-04 18:10

长了见识。

 re: vs2005编译 2007-02-11 12:00

我当时也遇到了这个问题,弄了我半天才弄好。—— 其实应该一出门就对的,不知道哪里出问题了,正确的方法不对,后来又对了。

redist基本没什么花头。
debug版本,如果要win2k/xp/2003等,最好是copy那个VC安装目录里的XXXDebugXXXCRTXXX下的内容到可运行程序所在路径(当然有MFC的内容时也要copy MFC);不考虑2k,只考虑xp/2003等系统本身支持Manifest的,只要copy整个文件夹到可运行程序路径即可。

 to 清风雨 2007-02-14 12:00

你的方法我用过,但好像某些时候还是会出问题(记不清了),所以还是我的保险一点:)

 re: vs2005编译的程序不能运行的几个解决方法 2008-07-18 15:20

感谢,我用vs2008也遇到这个问题,按照你的方法解决了:)

但debug版只拷贝debug相关的还出错,一气之下vc90开头的全部copy,再运行程序就好了


--------------------next---------------------

阅读(537) | 评论(0) | 转发(0) |
0

上一篇:转载:C/C++中的序列点

下一篇:sizeof的计算

给主人留下些什么吧!~~