VS2008生成的程序无法在其它电脑上运行,提示系统无法执行指定的程序
经过一番查找,最给力的参考是
http://www.cnblogs.com/visoeclipse/archive/2010/02/27/1674866.html
-----------------------以下为转载--------------------------------------------------------------
首先感谢这位几仁兄的几篇博客:
http://hi.baidu.com/fairysky/blog/item/130dda13db7b050a5aaf53be.html
http://hi.baidu.com/fairysky/blog/item/e7a8366dbaa735f3431694c8.html
http://www.cppblog.com/lf426/archive/2008/04/12/46885.aspx
时间缘由:
有时间再来整理:有点凌乱,不好意思。
感谢的XCyber回复:
如果我们将这个HelloWorld.exe拷贝到其它的机器上(没有安装vc2008 sp1或Microsoft
Visual C++ 2008 SP1
Redistributable
Package (x86)),则程序因为没能找到vc90
CRT,而不能运行,弹出“应用程序配置不正确,程序无法启动”对话框。
根据参考资料的文章中的内容,对于release版程序,有一个简单的办法就是安装“vcredist_x86.exe”,文件大小4M左右,自动安装在“C:\WINDOWS\WinSxS”目录下,包含了CRT、MFC、ATL等库的dll和manifest清单文件;整个安装时间不到1分钟。
如果机器上安装了vc2005/vc2008,则会自动的安装vcredist_x86.exe程序,安装后在“控制面板”->“添加删除程序”中有一项“Microsoft Visual
c++ 2008 Redistributable - x86 9.0.3.729”(我安装的是Microsoft Visual C++ 2008 SP1
Redistributable Package (x86) 版本)
注意:要根据编译器版本以及vc2005/vc2008是否安装了sp1补丁进行选择对应的vcredist.exe版本
上述的解决办法我称之为共享程序集部署方法,同样的我们也可以采用私有程序集的部署方式来发布程序。
Helloworld例子的私有程序集的部署方法:(针对release版本,仍然是采用上面的例子
,采用参考资料中提到的第2中私有程序集部署方法:将Microsoft.VC90.CRT目录下的manifest文件的版本号修改为9.0.21022.8)
1、将编译后的程序拷贝到一个目录下,假定为d:\helloworld
2、将vc安装目录下的redist\x86目录下的Microsoft.VC90.CRT目录拷贝到d:\helloworld(假定vs安装在C:\Program
Files\Microsoft Visual Studio 9.0,则vc安装目录为C:\Program Files\Microsoft Visual
Studio 9.0\VC)
3、将Microsoft.VC90.CRT目录下的manifest文件的版本号修改为9.0.21022.8(用记事本打开修改)
最终发布程序的目录结构
D:\helloworld
|--helloworld.exe
|--Microsoft.VC90.CRT
|--Microsoft.VC90.CRT.manifest
|--msvcm90.dll
|--msvcp90.dll
|--msvcr90.dll
这个时候,程序的manifest文件(已经内嵌到exe中了)依赖的vc90
CRT的版本号和Microsoft.VC90.CRT.manifest文件的版本号对应一致,都是9.0.21022.8(但是要注意的是,我们的helloworld程序实际上依赖的vc90
CRT版本是9.0.30729版本,这里只是采用了一种欺骗的方法,因为我们编译时链接的CRT的版本是9.0.30729版本)
例子是针对release版,对于debug版本必须要采用私有程序的部署方法,这是拷贝的目录就不是release版的Microsoft.VC90.CRT了,而是Microsoft.VC90.DebugCRT,方法同release版的是一样的
Microsoft Visual C++ 2008 发布程序的部署问题 生成Microsoft.VC90.CRT文件目录结构:
VC2005和VC2008编译出来的程序放到别人的电脑上为什么有可能无法运行呢?
这个问题无数人在问,但是很遗憾,没有人给出完整的解释和完美的解决方案。其实我也只有一台电脑,而且装了VC了,这个问题必须要台没有装这类软件的电脑
才容易去分析。感谢那些为了测试我小程序的朋友,是你们一次次在如此恶劣的网络速度下收取我一次次修改的dll包和部署文件,才让这个问题的完美解决方案
浮出水面。这里就把我的经验给大家分享吧。
1:Microsoft Visual C++ 2008 Express
Edition可以发布软件吗?
能!
很多人说,因为是Express版,不是Studio,所以只是用来练习语言的,不能发布软件——错!
除了没有MFC和ATL,基本上跟
.net 版本是一样的。发布出来的,是完整的可执行文件。
2:VC 2008 (2005)
发布出来的程序必须附带上他们特定的dll文件吗?
不一定。
如果目标系统是个经常升级的系统,微软已经为其打上了所需要的dll文件补丁了,不需要在软件包里面附加特定的dll文件。特别在Vista系统中,你更是不需要VC8和VC9的dll文件。但是在一些老版本的系统中,这些文件就是必须的。
3:VC2008和VC2005特定的dll文件是哪些?
VC8:
msvcm80.dll, msvcp80.dll, msvcr80.dll
VC9: msvcm90.dll, msvcp90.dll,
msvcr90.dll
4:如何部署文件?
首先,请选择release版本;在生成可执行文件(exe文件)的时候,会得到相应的部署文件(manifest文件)。
比如,得到a.exe文件,就会同时生成a.exe.intermediate.manifest文件。请将这2个文件放在同一文件夹下。
然后,你需要VC8和VC9的部署文件:Microsoft.VC80.CRT.manifest和Microsoft.VC90.CRT.manifest。
请到你的VC安装目录下寻找,比如:
C:\Program
Files\Microsoft Visual Studio
9.0\VC\redist\x86\Microsoft.VC90.CRT
我这里也把2个部署文件直接贴出来,没装的直接用就是了:
Microsoft.VC80.CRT.manifest
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<noInheritable></noInheritable>
<assemblyIdentity type="win32" name="Microsoft.VC80.CRT" version="8.0.50727.762" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
<file name="msvcr80.dll" /> <file name="msvcp80.dll" /> <file name="msvcm80.dll" />
</assembly>
Microsoft.VC90.CRT.manifest
<!-- Copyright (c) Microsoft Corporation. All rights reserved. -->
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<noInheritable/>
<assemblyIdentity
type="win32"
name="Microsoft.VC90.CRT"
version="9.0.21022.8"
processorArchitecture="x86"
publicKeyToken="1fc8b3b9a1e18e3b"
/>
<file name="msvcr90.dll" /> <file name="msvcp90.dll" /> <file name="msvcm90.dll" />
</assembly>
然后将VC8的3个dll以及这个manifest装到一个文件夹里,并将文件夹命名为Microsoft.VC80.CRT。
同样将VC9的3个dll以及这个manifest装到一个文件夹里,并将文件夹命名为Microsoft.VC90.CRT。
将这2个文件夹放到与exe文件(及其部署文件)所在目录下就OK了。
至于为什么VC9编译的程序要用VC8的dll,大家可以看看我例程部署文件:
<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel level='asInvoker' uiAccess='false' />
</requestedPrivileges>
</security>
</trustInfo>
<dependency>
<dependentAssembly>
<assemblyIdentity type='win32' name='Microsoft.VC90.CRT' version='9.0.21022.8' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />
</dependentAssembly>
</dependency>
<dependency>
<dependentAssembly>
<assemblyIdentity type='win32' name='Microsoft.VC80.CRT' version='8.0.50727.762' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />
</dependentAssembly>
</dependency>
</assembly>
VC
2008生成出来就需要VC90和VC80的CRT,我们能有什么脾气呢……
也就是说,还别管你exe文件多大,要保证正常运行,我们需要首先拷贝这8个文件……
MinGW(gcc)编译的就没这些麻烦。所以,我现在都是用两个编译器编译两个exe以供发布了。
VS2008生成的程序无法在其它电脑上运行,提示系统无法执行指定的程序的更多相关文章
- 如何在其他电脑上运行VS2005编译的DEBUG版应用程序
做项目的过程中,遇到这样的问题:在自己的电脑上用VS2005编译好的DEBUG版程序在其它的没有安装VS2005的电脑上没有办法运行,郁闷至极啊. 直 接拷贝文件后,错误信息如下:"This ...
- QT 如何让release生成的EXE可在他人电脑上运行(尝试了全网的方法后,这应该能帮你解决)
这两天,迅速上手了QT并用其基于C++编写了一个含UI的小程序 跳过中间的开发阶段 当我兴致满满的要将程序打包时,却是费尽周折,搜尽全网的关于QT的打包教程,最后都不顶用. 后面自己和队友的共同发现, ...
- VS2015升级Update2之后Cordova程序提示:此应用程序无法在此电脑上运行
VS2015在升级到Update2之后,有可能出现如下异常,在运行Cordova项目时提示: 查看输出面板会有乱码错误信息: 出现此问题的原因是在于npm程序损坏了.vs调用的npm程序并不是在nod ...
- Delphi XE2 生成的.exe 在未安装有Delphi的电脑上运行提示 “丢失 rtl160.bpl”
解决方案: XE2中加入了多平台的概念,默认的Release模式,也是带包编译,带运行时库的,所以,需要手工设置一下工程选项: 打开工程以后,Project-->Options-->左侧树 ...
- 让opencv程序在没有安装opencv的电脑上运行
经常需要把用opencv写的程序拿到没有装opencv的电脑上去运行和演示,要让opencv程序脱离opencv环境,一般有两种方法: 一种是动态链接opencv,即把相应的dll拷贝到exe所在目录 ...
- 用VS2010编写的C++程序,在其他电脑上无法运行,提示缺少mfc100.dll的解决办法
问题: 在自己电脑上用VS2010编写的VC++程序(使用MFC库),不能在其他电脑上运行.双击提示: "无法启动此程序,因为计算机中丢失mfc100.dll 尝试重新安装该程序以解决此问题 ...
- 关于C++编译的程序无法在新一台电脑上运行总结
最近在调用一个SDK调试一个主板的DPIO. 可是编译好的程序在开发电脑上运行没问题,到了新主板建立的电脑系统上就出问题. 总结了下要注意一下几方面. 1:程序本身要没有问题.至少在开发电脑系统环境下 ...
- 用VS2010编写的C++程序,在其他电脑上无法运行的问题
问题:在自己电脑上用VS2010编写的VC++程序(使用MFC库),不能在其他电脑上运行.双击提示: “无法启动此程序,因为计算机中丢失mfc100u.dll 尝试重新安装该程序以解决此问题. 解决方 ...
- 在预装win8的电脑上换win7系统讲解
现在买电脑,如果电脑预装的系统是win8系统,那么这个电脑的默认启动模式应该就是UEFI模式,现在UEFI模式正在逐渐取代传统模式.UEFI启动需要一个独立的分区,它将系统启动文件和操作系统本身隔离, ...
随机推荐
- base64计算
zjzc01:/root# cat aa.pl use URI::Escape; use URI::Escape qw(uri_unescape); use MIME::Base64; use Dig ...
- SOCKET 实现NAT 穿越
在当前IPv4NAT盛行的网络环境下,两个用户要直接进行P2P连接是非常困难的.较好的解决办法是借助含公网的用户或是服务器中介实现P2P连接. NAT:Network Address Translat ...
- 不得不看的JVM内存管理
作为一个任何完整的机器都会有内存管理这块组成结构.作为jvm也有自己的内存管理. 1.那么在java中哪些组件需要使用内存. a) Java堆 b) 线程:线程是在jvm运行 ...
- [Oracle] 参数修改小结
v$parameter Oracle参数的修改比较复杂,有些参数是可以在session级别修改,有些则必须在system级别修改,有些参数修改后马上生效(不需要重启),有些参数则必须重启才能生效,那么 ...
- 【转】vlc android 代码编译
转自:http://blog.csdn.net/asircao/article/details/7734201 系统:ubuntu12.04代码:git://git.videolan.org/vlc- ...
- 【转】Windows与Linux(Ubuntu)双系统时间不一致的解决方法
当在嵌入式Linux里面备份文件时候,在备份的时候,PC(win7)和开发板的时间都是9:30,但是在开发板发现文件创建时间是9:30,然后u盘插在PC(win7)上,发现文件创建时间是1:30,为什 ...
- 删除list中指定值的元素
public class ListRemoveAll { public static void main(String[] args) { // TODO Auto-generated method ...
- Super Jumping! Jumping! Jumping!(dp)
Super Jumping! Jumping! Jumping! Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 ...
- 智能路由——ESB
SOA之我见 SOA已然是企业级开发的必定之路.有人会问:我们有了OOP,还须要SOA吗?好吧我承认,这个问题也困扰了我非常久.现现在我得出的结论是:OOP是OOP,SOA是SOA. OOP是指面向对 ...
- linux 常用 命令 笔记二
wget 下载,得到网络上的内容 grep 文件搜索工具 EveryThing is a file in the linux system 安装 cowsay sudo apt-get install ...