这两天有点焦头烂额, 我们这边运行的好好的程序, 到了测试的机器上就不能启动(是根本运行不了, 而不是运行出错), 弄得我异常郁闷. 经过了一番摸索, 发现和 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 应用程序部署的几片文章, 供参考:
- Troubleshooting C/C++ Isolated Applications and Side-by-side Assemblies
- [Deployment Examples](http://msdn2.microsoft.com/en-us/library/ms235285(VS.80).aspx)
以下是与这个问题相关的一些系统提示信息, 为了让碰到这些问题的人更容易搜到这篇文章, 我把它们列在这里.
- 参照的汇编没有安装在系统上
- 应用程序要求的组件版本同另一个活动的组件有冲突。
- 系统无法执行指定的程序
- ERROR_SXS_ASSEMBLY_NOT_FOUND
- 14003
- 0x800736B3
- The referenced assembly is not installed on your system
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于