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

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

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

解决方案? 通过VCREDIST.EXE(Visual C ++ Redistributable Package)在目标计算机上安装DLL,或者静态链接到CRT(将已使用函数的实际代码直接插入EXE)。

分发和安装VCREDIST以及一个简单的应用程序是一个痛苦的屁股,所以我选择了第二个选项:静态链接。 这很简单:转到项目的属性,展开C / C ++,单击代码生成,并将运行时库设置为其中一个非DLL选项。 这里的所有都是它的。

这里的问题是缺少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 ++ – >代码生成 – >运行时库并选择“multithreading/ MT”

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

新项目 – >“设置和部署” – >“设置项目”

将应用程序项目的输出(使用运行时的DLL版本定义)加载到安装程序项目中并构建它。 将注意到对运行时DLL的依赖性,包含在安装程序包中,并且整齐且不显眼地安装在目标计算机上的正确位置。

适合您的VC Redist软件包是Visual Studio安装的一部分。 对于VC 8,您可以在此处找到它:

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

可能的解决方案……..

编辑:(删除我的大部分post)长话短说,我有类似的问题,得到“应用程序配置不正确”的消息等等.Depends.exe只发现ieshims.dll和wer.dll作为可能的问题,但这不是问题。 我最终使用了multithreading(/ 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机器没用。

所以试一试这些东西,你可能会有一些运气。

首先要做的就是使用它

 #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/

通过这样做,您的应用程序将运行更大范围的运行时库版本。

通常,此错误是尝试运行使用.NET的应用程序的调试版本的结果。 由于.NET可再发行组件包不包含随Visual Studio一起安装的dll的调试版本,因此在未安装Visual Studio的任何其他计算机上运行时,应用程序通常会收到此错误。 如果您还没有,请尝试构建应用程序的发布版本,看看是否有效。

另请注意 – 如果您更改为静态运行时,如果您的应用使用MFC,则必须对MFC执行相同操作。 这些设置位于properties-> Configuration / General中

我遇到了这个问题,并且能够非常简单地修复它。

Visual Studio为您提供了为每个构建构建清单的选项(默认情况下已启用)。

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

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

您应该查找类似myprogram.exe.indermediate.manifest的文件名

如果它与exe在同一个文件夹中(并且你有所有的dll)它应该运行