3

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

4

10 回答 10

5

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

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

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

于 2008-09-19T03:58:55.303 回答
5

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

http://www.dependencywalker.com/

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

于 2008-09-19T04:46:59.510 回答
1

您很可能会错过 Visual Studio 的运行时库(CRT 等),您可以摆脱这些依赖项(静态链接)或在目标计算机上安装 VC redist 包。

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

视觉 C++ 2005

视觉 C++ 2005 SP1

视觉 C++ 2008

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

于 2008-09-19T07:43:14.593 回答
1

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

c++ -> 代码生成 -> 运行时库并选择“多线程/MT”

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

新建项目->“设置和部署”->“设置项目”

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

于 2008-09-19T11:58:51.350 回答
1

适合您的正确 VC Redist 包是 Visual Studio 安装的一部分。对于 VC 8,你可以在这里找到它:

\Program Files\Microsoft Visual Studio 8\SDK\v2.0\BootStrapper\Packages\vcredist_x86
于 2008-09-20T13:49:18.970 回答
1

可能的解决方案…………

编辑:(删除了我的大部分帖子)长话短说,我遇到了类似的问题,收到“应用程序配置不正确”消息等。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 机器上工作没有工作。

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

于 2009-10-11T23:58:48.633 回答
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/

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

于 2009-12-28T23:54:45.690 回答
0

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

于 2008-09-19T04:09:06.793 回答
0

另请注意 - 如果您更改为静态运行时,如果您的应用程序使用 MFC,您将必须对 MFC 执行相同的操作。这些设置在属性->配置/常规中

于 2008-11-07T16:02:57.080 回答
0

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

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

清单放在发布文件夹中,但它与 exe 是不同的发布文件夹。

即使使用设置实用程序,它也没有打包。

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

如果它与 exe 位于同一文件夹中(并且您拥有所有 dll)它应该运行

于 2009-11-10T23:41:19.197 回答