我的 C(++) 程序是使用 Visual C(++)/Visual Studio 编写和编译的,在我自己的机器上运行良好,但拒绝在另一台机器上运行。我收到的错误消息是“此应用程序无法启动,因为应用程序配置不正确。重新安装应用程序可能会解决此问题。”
10 回答
如果您编写 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++ 版本,您必须安装不同的软件包:
警告:这些包仅包含库的发布版本,如果您希望能够分发应用程序的调试版本,您必须自己处理所需的 DLL。
静态链接到运行时是最简单的。
c++ -> 代码生成 -> 运行时库并选择“多线程/MT”
但是,这确实使您的可执行文件大了几百 KByte。如果您要安装大量小程序,这可能会成为一个问题,因为每个小程序都会被自己的运行时副本所累。答案是创建一个安装程序。
新建项目->“设置和部署”->“设置项目”
将应用程序项目的输出(使用运行时的 DLL 版本定义)加载到安装程序项目中并构建它。对运行时 DLL 的依赖将被注意到,包含在安装程序包中,并且整齐且不显眼地安装在目标机器上的正确位置。
适合您的正确 VC Redist 包是 Visual Studio 安装的一部分。对于 VC 8,你可以在这里找到它:
\Program Files\Microsoft Visual Studio 8\SDK\v2.0\BootStrapper\Packages\vcredist_x86
可能的解决方案…………
编辑:(删除了我的大部分帖子)长话短说,我遇到了类似的问题,收到“应用程序配置不正确”消息等。Depends.exe 只是发现 ieshims.dll 和 wer.dll 作为可能的问题,但这不是问题。我最终使用了多线程 (/mt) 编译选项。但是,作为一个可行的解决方案,已经奏效的是使用 InstallShield 制作安装程序。我在 installshield builder 中选择了几个合并模块,这似乎解决了我的问题。选择的模块是: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 完全更新的机器上,以及在带有裸机(.net 3.5 和 VC++ 2008 RTM 的 VMWare XP SP3 机器上)以及之前的伙伴 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 执行相同的操作。这些设置在属性->配置/常规中
我遇到了这个问题,并且能够非常简单地解决它。
Visual Studio 为您提供了为每个构建构建清单的选项(默认情况下)。
清单放在发布文件夹中,但它与 exe 是不同的发布文件夹。
即使使用设置实用程序,它也没有打包。
您应该查找类似 myprogram.exe.indermediate.manifest 的文件名
如果它与 exe 位于同一文件夹中(并且您拥有所有 dll)它应该运行