使用Visual Studio构建的EXE文件在另一台计算机上运行出现问题

26

我使用Visual Studio在C++中创建了一个客户端服务器应用程序。

现在我想在另一台没有安装Visual Studio的计算机上运行客户端EXE文件, 但当我尝试运行EXE文件时,它会给出以下错误消息:

此应用程序无法启动,因为应用程序配置不正确。重新安装应用程序可能会解决此问题。

如何在计算机上不安装任何软件的情况下运行EXE文件?


3
计算机是否拥有正确版本的C运行时库。在安装程序中通常会包含msvcrtXX.dll文件,其中XX代表版本号。 - j.karlsson
如果使用pyinstaller创建exe文件并尝试检测Python版本并运行exe文件,则对我来说它将起作用。 - Amarnath Reddy Surapureddy
6个回答

30

使用 Visual Studio 构建的应用程序依赖于 Visual C++ Redistributable(VCRedist)。当程序被动态链接时,你的二进制文件将需要 MSVCR**.dll(Microsoft C 运行时库)。

在 MSDN 上,有一篇很好的文章叫做 Redistributing Visual C++ Files (for Visual Studio 2008),它指出如果未安装所需的 Visual C++ 库,则可能会出现潜在的运行时错误:

根据你尝试运行应用程序的 Windows 版本,你可能会收到以下错误消息之一:

  • 应用程序无法正确初始化(0xc0000135)。
  • 此应用程序无法启动,因为应用程序配置不正确。重新安装应用程序可能会解决此问题。
  • 系统无法执行指定的程序。
  • 最简单的解决方法是将运行库的动态链接改为静态链接。转到项目属性,在 C/C++ → 代码生成 下,您会找到 运行库 选项。您需要将其从 多线程 DLL (/MD) 更改为 多线程 (/MT)
  • 另一种可能的解决方法是确保目标机器安装了正确版本的 Microsoft VC++ Redistributable Package。

但是您的应用程序可能还依赖其他 DLL 文件。如果您想查找程序的依赖关系,有一个名为 Dependency Walker 的实用工具可以帮助您解决这个问题以及其他许多情况 :)


3
支持建议使用静态链接,这是回答原帖问题的真正答案(如何在不安装任何软件的情况下运行)。depends 是一个很好的工具,可以找出缺失的库。 - Nate Hekman
你的第二个要点对OP没有帮助,因为她有一个限制条件,即不能在目标机器上安装任何东西。此外,还有超过两种解决方案-请参见Nayana的答案。 - JBentley
抱歉,我无法从 DLL 进行更改。此外,我正在尝试在其他计算机上运行 exe 文件而无需安装任何东西。 - Karen123456
虽然这似乎是一个废话,但请确保如果你从“多线程 DLL (/MD)”切换到“多线程 (/MT)”,你也要在编译的配置(调试或发布)上进行相应的更改。 - undefined

13

背景:

  • C++ 应用程序在任何 Windows 计算机上运行时都需要运行时程序集(DLL 文件)。
  • 通常这些运行时程序集位于 C:\Windows\Winsxs 目录中。
  • 所有的 Windows 操作系统默认都带有几个运行时程序集。
  • 但如果你的应用程序是在一个更新版本的运行时程序集环境中开发的,目标计算机上也需要存在相同版本的运行时程序集。
  • 安装 Visual Studio 时,大多数更新版本的运行时程序集会安装到你的计算机上。

解决方案:

无论如何,目标计算机都必须拥有完全相同的运行时程序集。以下是几种方法(有关更多详细信息,请在 Google 中搜索):

  1. 将运行时程序集与应用程序静态链接(对于大型应用程序来说很麻烦)。
  2. 在目标计算机上安装 C++ 分发环境(最简单的方法)。
  3. 创建设置项目,在安装应用程序时部署运行时程序集(还不错)。
  4. 要将运行时程序集部署为专用程序集(专业),请参见此处了解更多详细信息。

条件:

  • 你的应用程序不能使用 .NET 框架。
  • 你的应用程序不能使用公共语言运行时支持。

在我看来,这应该是被接受的答案,因为它是唯一提到私有程序集选项的答案。其他一些答案是明显错误的,因为它们声称只有两个选项(而其中一个选项对于OP来说是无用的,因为她有一个不能在目标机器上安装任何东西的限制)。 - JBentley
我已经尝试了部署运行时程序集和安装C++重定向,但我仍然收到相同的错误。 - Karen123456
好的,我现在会帮助你,所以你必须快速回复我:)你的应用程序只包括一个 exe 还是包括任何其他的 DLLs - Nayana Adassuriya

7

我将程序发布到了 release 版本而不是 debug 版本,现在 EXE 文件可以在另一台电脑上运行。


6
我之前没有见过这个具体的错误。通常情况下,它是围绕着缺少DLL(Windows可再分发库)而产生的错误。假设配置实际上没有问题,您有两种选择:
  1. 将编译模式从多线程 DLL更改为多线程。这可以在项目属性的C++部分下的代码生成中完成。在多线程模式下,您的二进制文件将静态链接到Windows可再分发库。这可能是您想要的。
  2. 在目标机器上安装Windows可再分发库。这可能不可行,因为您声明您不想在目标机器上安装任何东西。
关于选项1的警告:不同版本的Windows有不同版本的可再分发库。在高度专业化的环境中,静态链接程序可能无法按预期运行。

有超过两个选项。请参考Nayana的答案。 - JBentley

3

看起来你缺少一些DLL文件。请确保将适当的DLL文件与EXE文件一起复制。


1
听起来他缺少VC++运行时DLL文件。他在问如何在没有这些文件的情况下发送一个exe文件,所以你的回答并没有帮助到他。 - Caesar
如果缺失的依赖项不是 C++ 可再发行组件,那么这个答案确实有帮助。你应该知道程序员可以使用各种各样的 DLL,而不仅仅是 MSVC 的,对吧? - Sheng Jiang 蒋晟
@caesar,他没有说不带.exe文件,他是说不需要安装任何东西,所以这个答案是可以的。 - JBentley
我曾经遇到过完全相同的问题。你的应用程序所需的任何.dll文件都放置在发布文件夹中。因此,当我只复制了.exe文件时,它无法打开,因为它正在寻找.dll文件。请将.dll文件与.exe文件一起带上,或者如果可能的话,请删除依赖项。 - Russell

1

我正在使用Visual Studio 2019,并找到了一个非常有用的配置属性,以解决将简单应用程序移动到另一台计算机而无需安装包的问题。

  • 打开项目属性页面。
  • 选择要应用此更改的配置,我使用了“所有配置”。
  • 在左侧窗口中单击展开名为“配置属性”的顶级节点。
  • 单击“高级”。在右侧窗口中查找名为“将C++运行时复制到OutDir”的属性,并将其设置为“是”。
  • 单击“确定”关闭属性窗口。

重新构建您的项目。 所有必要的dll将被复制到项目的输出目录中。 将您的exe和所有dll复制到另一台计算机上。 exe应该能够找到运行所需的所有内容。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接