1

自从我使用 VS 2010 和 C++ 以来已经有很长一段时间了,当我重新开始使用它时,我遇到了去年困扰我的同样问题:我编译的 exe 不能很好地运行没有正确 C++ 运行时的旧机器。我什至不知道给他们什么链接,我告诉他们安装这个 ,因为他们有一个错误说“程序无法启动,因为你的计算机中缺少 MSVCR100.dll。尝试重新安装程序来解决这个问题. 单击“确定”关闭应用程序。”)。所以我进去并将代码生成设置为 /MT 并禁用了很多选项,并尝试使用很多选项,但仍然是相同的结果。

我的问题是:是否有完整的 VS 2010 C++ 发行版列表,我可以提供并告诉他们安装,以便我在 VS 2010 上编译的所有 C++ 程序都可以在 Windows XP 上运行,甚至更好,这是一种通用的方法一个独立的 exe,包含它需要工作的所有内容,并且不依赖 DLL?我想链接到一个包含 exe 引用的所有内容的库。如果有帮助,我正在为 x64 和 x86 构建。

PS清单文件怎么了,我应该包含它吗?

4

5 回答 5

6

最简单的方法是安装 VC++ Redistributable Package。它有x86x64版本。

于 2011-02-14T23:35:05.187 回答
4

首先,在我真正给你细节之前:


警告

如果你这样做,事情会很糟糕,原因有两个:

  1. 如果 MSVC 运行时中存在安全性或其他错误,并且您采用这种方法,它们会被嵌入到您的应用程序中,这意味着您需要重新分发。DLL 是首选,因为理论上人们使用系统更新,这意味着任何错误都会得到修复。
  2. 您编译到 exe 中的所有其他内容也需要执行此操作。如果你不这样做,你最终会得到两个版本的代码,并且你使用的任何东西都不会链接。

cl.exe一种可能的解决方案是使用选项(C/C++ 编译器设置)将 MSVC 运行时烘焙到您的应用程序中,/MT这意味着静态链接的 C/C++ 运行时的多线程版本。正如我所说,如果您尝试链接自身动态链接到运行时的东西,那么您最终会陷入混乱。此外,正如我所说,这代表了一个额外的安全风险因素,所以请记住这一点。

其他选项是编写一个安装程序,该安装程序既可以下载适当的运行时,也可以包含所需的 DLL。

如果您使用的运行时的某些功能超过了某个版本的 Windows(通用声明,但确实发生了),那么您应该能够使用 Windows SDK 使用适当的 C 运行时来定位各种版本的 Windows。

于 2011-02-14T23:34:51.283 回答
3

http://www.microsoft.com/downloads/en/details.aspx?FamilyID=a7b7a05e-6de6-4d3a-a423-37bf0912db84

谷歌文本:Visual Studio C++ Redist

不要静态链接到运行时;如果您将任何类型的 dll 用于其他目的,特别是不要这样做。它介绍了您可能不想搞砸的堆管理方面的各种虚假问题。

于 2011-02-14T23:37:15.343 回答
1

打开项目的属性对话框并选择 Configuration Properties | C/C++ | 代码生成。默认设置是多线程 DLL。将其更改为多线程,您将构建和运行时静态链接的 .EXE。不要忘记对调试版本执行相同操作。

如果您使用 MFC 或 ATL,则需要导航到配置属性 | 一般并将“使用 MFC”或“使用 ATL”设置为静态链接。

注意:如果您静态链接运行时,您必须确保您链接的任何其他库也静态链接它。否则,您将在内存中得到两个运行时副本,每个副本都有自己的堆,当使用一个运行时的代码试图释放另一个运行时分配的对象时,就会发生坏事。

于 2011-02-14T23:36:32.423 回答
0

这个先前的答案应该适用于 VS2010。我仍然使用 VS2005 构建,但我所有的应用程序都使用静态 CRT,唯一的原因是能够在新旧机器上运行。

于 2011-02-14T23:31:11.890 回答