【问题标题】:Visual C++/Studio: Application configuration incorrect?Visual C++/Studio:应用程序配置不正确?
【发布时间】:2010-09-11 02:22:31
【问题描述】:

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

【问题讨论】:

  • 这似乎是一个重复的问题:stackoverflow.com/questions/87405/…
  • 关于这里的答案:静态和动态链接之间的优缺点:stackoverflow.com/questions/1993390/static-linking-vs-dynamic-linking

标签: c++ c visual-studio visual-c++


【解决方案1】:

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

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

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

【讨论】:

  • 好答案,只是想补充一点,静态链接可能会显着增加应用程序的大小。
  • also - 如果它使用 MFC,还必须设置该属性。有关位置,请参阅下面的我的帖子。
【解决方案2】:

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

http://www.dependencywalker.com/

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

【讨论】:

  • 如果存在与清单相关的问题,使用depends.exe 没有帮助,这是指定错误的#1 原因。
  • 提示:运行依赖walker,然后“另存为...”到一个文本文件。在两台机器上执行此操作,然后比较文件。就我而言,这向我表明并行配置不正确,并且未正确找到 Visual C++ 可再发行组件。反过来,这似乎是由使用从 Microsoft 下载的 vcredist_x86.exe 引起的,而不是我自己安装的。
【解决方案3】:

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

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

Visual C++ 2005

Visual C++ 2005 SP1

Visual C++ 2008

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

【讨论】:

    【解决方案4】:

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

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

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

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

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

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

      • 这个问题把我逼疯了。很容易找到要从 Microsoft 下载的 vcredist_x86.exe 版本,但不是我安装的 VS 中的版本。这些都没有解决问题。也没有从 VS 安装中手动复制单个 DLL 和清单。通过最终确定 vcredist_x86.exe 在我的 VS 安装中的位置,并在我的目标机器上运行它,一切正常。
      【解决方案6】:

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

      编辑:(删除了我的大部分帖子) 长话短说,我遇到了类似的问题,收到“应用程序配置不正确”消息等。 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 完全更新的机器上工作,在 VMWare XP SP3 机器上使用裸机(基本上是 .net 3.5 和 VC++ 2008 RTM) - 以及在伙伴的 XP 机器上它以前不起作用的地方。

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

      【讨论】:

      • 这应该是一个问题,而不是一个答案。无论如何...如果您使用的是/CLR:pure,那么您正在编写一个托管应用程序。您的问题很可能与此大不相同。
      【解决方案7】:

      你必须使用的第一件事

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

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

      【讨论】:

        【解决方案8】:

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

        【讨论】:

          【解决方案9】:

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

          【讨论】:

            【解决方案10】:

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

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

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

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

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

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

            【讨论】:

              猜你喜欢
              • 2011-07-10
              • 2016-01-25
              • 1970-01-01
              • 2010-10-01
              • 1970-01-01
              • 1970-01-01
              • 2017-03-18
              • 2012-05-04
              • 1970-01-01
              相关资源
              最近更新 更多