zoukankan      html  css  js  c++  java
  • vs编译后在本机能运行,在别的机器上运行提示runtime Error的问题

    一下内容转自http://blog.sina.com.cn/s/blog_83b3bb460101620n.html

    我们在部署VC2008应用程序时,经常会遇到下列提示:

    1.运行程序时出错;

    2.由于应用程序配置不正确,应用程序未能启动。重新安装应用程序可能会纠正这个问题。

    可能的解决办法如下:

    如果你编译了一个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的运态库!

    不过本人试过,VS2008已经不需要manifest 文件了,只需要将其他dll复制到发型版本目录下就行了。

    解决方法有两种.

    方法一:

    最简单的,修改Microsoft.VC90.CRT.manifest和Microsoft.VC90.MFC.manifest文件,将新的版本号改为旧的版本号,如果是依赖其它的Microsoft.VC90.*.manifest的文件,也同样是如此修改!

    如果是装了VC2008-SP1后,它的版本号是“9.0.30729.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包!

    不过,在VC2010,编译的程序会不再需要manifest文件!

    本人试过VC2008也不再需要manifest 文件了。

    平时用到Ogre+vc比较多,当用Ogre的时候,需要设置一些参数,在我本机上设置的参数比较高,拿到其他显卡不支持这些参数的机器上,就会碰到runtime error,而且你使用上面那些方法都搞不定。需要修改Ogre的显卡配置参数,比方说反走样、垂直同步等。然后再copy过去,ok应该就可以运行了

  • 相关阅读:
    Win10家庭版、专业版、企业版、教育版各版本功能区别对照表
    BaseDAL最牛数据层基类2
    C# 获得目录下所有文件或指定文件类型文件(包含所有子文件夹)
    IIS下众多网站,如何快速定位某站点日志在哪个文件夹?
    【进阶技术】一篇文章搞掂:OAuth2
    【进阶技术】一篇文章搞掂:RibbitMQ
    【系统架构理论】一篇文章搞掂:设计模式
    【前端技术】一篇文章搞掂:WeX5
    【c#技术】一篇文章搞掂:Newtonsoft.Json Json.Net
    【Java架构:持续交付】一篇文章搞掂:Jenkins
  • 原文地址:https://www.cnblogs.com/cg_ghost/p/2875200.html
Copyright © 2011-2022 走看看