我的C(++)程序,使用Visual C(++)/ Visual Studio编写和编译,在我自己的机器上运行良好,但拒绝在另一台机器上运行。我得到的错误消息是“此应用程序无法启动,因为应用程序配置不正确。重新安装应用程序可能会解决此问题。”
答案 0 :(得分:5)
如果您编写C ++程序,它会动态链接到C运行时库或简称CRT。这个库包含你的printf,malloc,你的strtok等等。该库包含在名为MSVCR80.DLL的文件中。默认情况下,此文件未安装在Windows系统上,因此无法运行该应用程序。
解决方案?通过VCREDIST.EXE(Visual C ++ Redistributable Package)在目标计算机上安装DLL,或静态链接到CRT(将已使用函数的实际代码直接插入EXE)。
分发和安装VCREDIST以及一个简单的应用程序是一个痛苦的屁股,所以我选择了第二个选项:静态链接。这很简单:转到项目的属性,展开C / C ++,单击代码生成,并将运行时库设置为其中一个非DLL选项。这就是它的全部内容。
答案 1 :(得分:5)
这里的问题是缺少DLL依赖,例如CRT(C运行时库)。诊断此类问题的一个很好的工具是Dependency Walker(depends.exe),您可以在此处找到:
http://www.dependencywalker.com/
您将在生成您发布的错误消息的计算机上运行此程序,并使用它来打开生成此错误的exe。 Dependency Walker将快速并以图形方式指示机器上所需但不可用的任何DLL。
答案 2 :(得分:1)
您很可能错过了Visual Studio的运行时库(CRT等),您可以摆脱这些依赖关系(静态链接)或在目标计算机上安装VC redist包。
根据您使用的Visual C ++版本,您必须安装不同的包:
警告:这些软件包只包含库的发行版本,如果您希望能够分发应用程序的调试版本,则必须自己处理所需的DLL。
答案 3 :(得分:1)
最简单的是静态链接到运行时。
c ++ - >代码生成 - >运行时库并选择“多线程/ MT”
然而,这确实使您的可执行文件大了几百KB。如果要安装大量小程序,这可能会成为一个问题,因为每个程序都有自己的运行时副本。答案是创建一个安装程序。
新项目 - > “设置和部署” - > “安装项目”
将应用程序项目的输出(使用运行时的DLL版本定义)加载到安装程序项目中并构建它。将注意到对运行时DLL的依赖性,包含在安装程序包中,并且整齐且不显眼地安装在目标计算机上的正确位置。
答案 4 :(得分:1)
正确的VC Redist包是Visual Studio安装的一部分。对于VC 8,您可以在此处找到它:
\Program Files\Microsoft Visual Studio 8\SDK\v2.0\BootStrapper\Packages\vcredist_x86
答案 5 :(得分:1)
可能的解决方案........
编辑:(删除了我的大部分帖子) 长话短说,我有类似的问题,得到“应用程序配置不正确”的消息等。 Depends.exe只找到ieshims.dll和wer.dll作为可能的问题,但这不是问题。 我最终使用了多线程(/ mt)编译选项。 然而,作为一种可行的解决方案,HAS使用InstallShield制作安装程序。 我在installshield builder中选择了几个合并模块,这似乎解决了我的问题。选择的模块是: VC ++ 9.0 CRT,VC ++ 9.0 DEBUG CRT和CRT WinSXS MSM合并模块。 我很确定它已经修复了它的WinSXS合并模块。
DEBUG CRT:我注意到某个地方(无论我怎么努力,到目前为止显然都失败了),我的发行版仍然依赖于DEBUG CRT。如果仍然如此,InstallShield合并模块现在已经将DEBUG CRT文件夹放在我的WinSXS文件夹中了。对于VC ++来说,我有点新手,我认为这通常会用于将程序的调试版本分发给其他人。为了测试这是否解决了我的问题我从WinSXS文件夹中删除了DEBUG CRT文件夹,应用程序仍然有用。 (除非某些东西仍然在后台运行等等 - 我不是那样的)
无论如何,这已经让我在XP SP3全面更新的机器上运行了,并且还在VMWare XP SP3机器上使用裸机(基本上是.net 3.5和VC ++ 2008 RTM) - 以及在配对的XP机器上它之前没有工作的地方。
所以试一试这些东西,你可能会有一些运气。
答案 6 :(得分:1)
首先必须使用
#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/
通过这样做,您的应用程序将运行更大范围的运行时库版本。
答案 7 :(得分:0)
此错误通常是尝试运行使用.NET的应用程序的调试版本的结果。由于.NET可再发行组件包不包含随Visual Studio一起安装的dll的调试版本,因此在未安装Visual Studio的任何其他计算机上运行时,您的应用程序通常会收到此错误。如果您还没有,请尝试构建应用程序的发布版本,看看是否有效。
答案 8 :(得分:0)
另请注意 - 如果您更改为静态运行时,如果您的应用使用MFC,则必须对MFC执行相同操作。这些设置位于properties-> Configuration / General
中答案 9 :(得分:0)
我遇到了这个问题,并且能够非常简单地修复它。
Visual Studio为您提供了为每个构建构建清单的选项(默认情况下已启用)。
清单放在release文件夹中,但它是一个与exe不同的版本文件夹。
即使使用安装实用程序,它也没有打包。
您应该查找类似myprogram.exe.indermediate.manifest
的文件名如果它与exe在同一文件夹中(并且你有所有的dll),它应该运行