Visual C ++ / Studio:应用程序配置不正确?

时间:2020-03-06 14:24:37  来源:igfitidea点击:

我的C(++)程序使用Visual C(++)/ Visual Studio编写和编译,可以在我自己的计算机上正常运行,但拒绝在另一台计算机上运行。我收到的错误消息是"此应用程序无法启动,因为应用程序配置不正确。重新安装应用程序可能会解决此问题。"

解决方案

如果编写C ++程序,它会动态链接到C运行时库(简称CRT)。该库包含printf,malloc,strtok等。该库包含在名为MSVCR80.DLL的文件中。默认情况下,此文件未安装在Windows系统上,因此该应用程序无法运行。

解决方案?通过VCREDIST.EXE(Visual C ++可再发行组件包)在目标计算机上安装DLL,或者静态链接到CRT(将所使用功能的实际代码直接插入EXE)。

分发和安装VCREDIST以及一个简单的应用程序非常麻烦,因此我选择了第二个选项:静态链接。这真的很容易:转到项目的属性,展开C / C ++,单击"代码生成",然后将"运行时库"设置为非DLL选项之一。这里的所有都是它的。

通常,此错误是尝试运行使用.NET的应用程序的调试版本的结果。由于.NET可再发行组件包不包括Visual Studio附带的dll的调试版本,因此,在未安装Visual Studio的任何其他计算机上运行应用程序时,应用程序通常会出现此错误。如果尚未安装,请尝试构建应用程序的发行版,看看是否可行。

这里的问题是缺少DLL依赖项,例如CRT(C运行时库)。诊断此类问题的一个很好的工具是Dependency Walker(depends.exe),我们可以在这里找到:

http://www.dependencywalker.com/

我们将在生成发布的错误消息的计算机上运行该程序,并使用它打开正在生成此错误的exe。 Dependency Walker将快速以图形方式指示计算机上所需但不可用的所有DLL。

我们很可能错过Visual Studio的运行时库(包括CRT),我们可以摆脱这些依赖关系(静态链接),也可以在目标计算机上安装VC redist程序包。

根据我们使用的Visual C ++版本,我们必须安装不同的软件包:

Visual C ++ 2005

Visual C ++ 2005 SP1

Visual C ++ 2008

警告:这些软件包仅包含库的发行版,如果我们希望能够分发应用程序的调试版本,则必须自己处理所需的DLL。

静态链接到运行时是最简单的。

c ++->代码生成->运行时库,然后选择"多线程/ MT"

但是,这确实使可执行文件大了几百KB。如果要安装大量的小程序,这可能是个问题,因为每个小程序都会自己拥有自己的运行时副本。答案是创建一个安装程序。

新项目->"设置和部署"->"设置项目"

将应用程序项目(使用运行时的DLL版本定义)中的输出加载到安装程序项目中并进行构建。将会注意到对运行时DLL的依赖关系,该依赖关系包含在安装程序包中,并且整洁且毫不干扰地安装在目标计算机上的正确位置。

为我们提供正确的VC Redist软件包是Visual Studio安装的一部分。对于VC 8,我们可以在这里找到它:

\Program Files\Microsoft Visual Studio 8\SDK\v2.0\BootStrapper\Packages\vcredist_x86

还要注意,如果我们更改为静态运行时,并且应用程序使用MFC,则必须对MFC执行相同的操作。这些设置位于属性->配置/常规中

可能的解决方案........

编辑:(删除了我的大部分帖子)
长话短说,我遇到类似的问题,收到"应用程序配置不正确"消息等。
Depends.exe只是将ieshims.dll和wer.dll查找为可能的问题,但这不是问题。
我最终使用了多线程(/ mt)编译选项。
作为可行的解决方案,HAS的工作是使用InstallShield制作安装程序。
我在installshield生成器中选择了几个合并模块,这似乎已经解决了我的问题。选择的模块是:
VC ++ 9.0 CRT,VC ++ 9.0 DEBUG CRT和CRT WinSXS MSM合并模块。
我非常确定它的WinSXS合并模块已修复该问题。

DEBUG CRT:我注意到某个地方(无论我多么努力,到目前为止显然还是失败了),我的Release版本仍然依赖DEBUG CRT。如果仍然如此,则InstallShield合并模块现在已将DEBUG CRT文件夹放置在我的WinSXS文件夹中:)作为VC ++的新手,我认为这通常用于将程序的调试版本分发给其他人。为了测试这是否解决了我的问题,我从WinSXS文件夹中删除了DEBUG CRT文件夹,并且该应用程序仍然有效。 (除非后台仍在运行某些东西,等等,但我不是那样)

无论如何,这已经使我在XP SP3完全更新的计算机上工作,也可以在裸露的VMWare XP SP3计算机上工作(基本上是.net 3.5和VC ++ 2008 RTM),还可以在以前曾经是伴侣的XP计算机上工作没有工作。

因此,尝试一下这些东西,可能会有些运气。

我遇到了这个问题,能够非常简单地解决它。

Visual Studio为我们提供了一个选项(默认情况下处于启用状态),可以为每个版本构建清单。

清单已放置在发行文件夹中,但它与exe是一个不同的发行文件夹。

即使使用安装实用程序,它也没有打包。

我们应该寻找一个文件名,例如myprogram.exe.indermediate.manifest。

如果与exe位于同一文件夹(并且我们具有所有dll),则应运行

我们必须使用的第一件事

#define _BIND_TO_CURRENT_VCLIBS_VERSION 1

或者在预处理器指令中添加" _BIND_TO_CURRENT_VCLIBS_VERSION = 1"。

该问题与绑定和清单类型有关,我们可以找到更多http://www.nuonsoft.com/blog/2008/10/29/binding-to-the-most-recent-visual-studio-libraries/

这样,应用程序将在更大范围的运行时库版本中运行。