我的 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++ 版本,您必须安装不同的软件包:

视觉C++ 2005

视觉 C++ 2005 SP1

视觉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

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

编辑:(删除了我的大部分帖子)长话短说,我遇到了类似的问题,获取“应用程序配置不正确”消息等。Depends.exe 仅发现 ieshims.dll 和 wer.dll 可能存在问题,但这不是问题所在。我最终使用了多线程(/mt)编译选项。不过,作为一个可行的解决方案,有效的是使用 InstallShield 制作安装程序。我在 installshield builder 中选择了几个合并模块,这似乎解决了我的问题。选择的模块是:VC++ 9.0 CRT、VC++ 9.0 DEBUG CRT 和 CRT WinSXS MSM 合并模块。我很确定 WinSXS 合并模块已经修复了它。

调试 CRT:我注意到(无论我多么努力地尝试,到目前为止显然失败了),我的发布版本仍然依赖于 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 执行相同的操作。这些设置位于属性->配置/常规中

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

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

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

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top