【问题标题】:If C++ compiles to machine code, why do we need to install a 'runtime'?如果 C++ 编译为机器码,为什么我们需要安装“运行时”?
【发布时间】:2018-02-24 13:53:57
【问题描述】:

在编译过程结束时,程序位于机器码的 .exe 文件中。那么机器不应该无需安装MS Visual Studio C++之类的东西就可以运行它吗?基本上,我正在用 mingw 制作一个程序,并想与其他人分享。我不明白为什么我不能只向他们发送 .exe 文件。澄清将不胜感激。

【问题讨论】:

  • @S.M.那我如何在另一台电脑上运行这个.exe?大多数似乎只适用于视觉工作室。
  • mingw 运行时是必需的,如果有的话,出于同样的原因。
  • 另一台计算机可能已经有运行时(它可能有)。请注意,运行时与安装 Visual Studio 不同——它是一个单独的东西。碰巧你在安装 Visual Studio 时安装了这些运行时。
  • 你不喜欢mingw,考虑不要用。 VS 可以为你构建一个没有依赖关系的程序:davidlenihan.com/2008/01/choosing_the_correct_cc_runtim.html

标签: c++ compilation


【解决方案1】:

C++ 将你的代码编译成机器码。如果您的程序是独立的,那么这就是您所需要的。但是,更复杂的运行程序通常依赖于额外的编译代码,这些代码通过库提供给您的程序。

通常,库有两种“风格”——静态和动态。静态库被“烘焙”到您的编译代码中。这并不理想,因为多个程序包含相同的代码,导致代码重复。另一方面,动态库在所有使用它们的程序之间共享,从而更有效地利用空间。

安装运行时会添加动态库,供所有使用 C++ 编译的程序使用。

【讨论】:

  • 所以基本上我们使用的是内置库,这些库必须由运行时作为 DLL 提供?
  • “如果你的程序像 cout << "Hello, world!" 这样简单,这就是你所需要的” 不好的例子,iostream 依赖于运行时通常提供的很多东西图书馆。
  • cout 取决于很多。
  • @MatteoItalia 你是对的,即使是最简单的"hello, world" 程序也可能需要库。谢谢!
  • 请注意,运行时不仅仅是您可能调用的库函数,还有编译器假定可用的库代码。你的程序并不是真正从main 开始的。编译器生成初始化事物的代码和调用main。一些生成的代码可能依赖于运行时,即使你从不调用库函数。
【解决方案2】:

您的程序可能会调用标准库中的许多不是您自己编写的函数。为此,您需要运行时库。您的代码可能还需要在 main 之前运行代码以设置 C++ 程序所需的基本环境 - 运行时库会为您执行此操作。同样在 main 结束后,需要根据标准进行各种清理(您的程序可能也依赖于此),编译器运行时库会处理此问题。

您的代码并不存在于真空中(它可以,但它不再是标准的托管 C++ 程序)。它依赖并依赖于标准运行时库来提供 C++ 标准所说的您可以期望的环境。

【讨论】:

  • 所以如果我用 g++(mingw) 编译,我能在安装了 Visual Studio Redistributable 的机器上运行它吗?因为它只是一个运行时?
  • @KidDoesCodingAnd HasNoFriends - 不。那么您需要将 mingw 的运行时库与您的程序一起分发。就像使用 Visual Studio 编译的程序需要您分发该编译器运行时库一样。您的程序所需的运行时库取决于用于构建它的编译器。
  • 但是它们不会被编译成相同的 .exe 文件吗?还是我错过了什么?
  • 只有当你静态链接它们时,如果没有,你仍然需要 mingw 的运行时库在它们旁边。
  • @KidDoesCodingAnd HasNoFriends 你错过了“exe”不是一个独立的东西这一事实。它取决于其他东西,例如用于构建它的编译器的运行时库。
猜你喜欢
  • 1970-01-01
  • 2021-06-27
  • 1970-01-01
  • 1970-01-01
  • 2013-08-04
  • 2015-05-15
  • 2015-10-04
  • 2018-04-17
相关资源
最近更新 更多