【问题标题】:Why do I need a C++ redistributable for a specific IDE?为什么我需要针对特定​​ IDE 的 C++ 可再发行组件?
【发布时间】:2021-06-29 23:19:36
【问题描述】:

在使用 C++ 进行开发时,开发人员经常使用 Visual Studio 进行 Windows 开发。在设置 VS IDE 时,Microsoft 提供了一组可供下载的 C++ 可再发行组件,以便使用 Visual Studio。 C++ 可再发行组件包含 .dll 用于标准库,例如 <stdio>。我的问题是,为什么微软在网站上说这些可分发是“用于 Visual Studio”的。例如,是什么阻止了我,下载 C++ 可再发行组件并使用不同的 IDE,让我们假设 Geany 并在其他地方编辑源代码。我们只需要标准库的.dll,一旦获得它们,我们就可以在任何我们想要的地方编辑我们的源代码?

【问题讨论】:

  • 当作为 DLL 链接时,可再发行组件包含运行时库的代码。它们与其说是“用于 Visual Studio”,不如说是用于随特定版本的 Microsoft 编译器分发的头文件。如果您想在其他地方编辑代码并使用该编译器,没有什么能阻止您,但除非您静态链接所有内容,否则您仍然需要可再发行组件来运行该编译程序。
  • 哦,是的,您也可以考虑使用support.microsoft.com/en-us/topic/… aka Universal C Runtime。
  • VS2015 到 2019 中的 msvc 编译器相互二进制兼容,但与任何其他 msvc 版本不兼容。相关:https://docs.microsoft.com/en-us/cpp/porting/binary-compat-2015-2017?view=msvc-160 当涉及到基于 c++ 的二进制文件时,它们通常也与 mingw 不兼容。如果您坚持使用c,则只有一些兼容性。

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


【解决方案1】:

它与 IDE 没有任何关系。它与 Microsoft 的 C++ 编译器有关,当您使用动态链接时,它需要运行时库的可再发行组件。并且可再发行组件是特定于版本的。

每个新版本的 Visual Studio IDE 都捆绑了不同版本的 C++ 编译器工具链。不幸的是,Visual Studio 版本号与 C++ 编译器的实际版本有很大不同。因此,Microsoft 选择使用 Visual Studio 版本来标记运行时可再发行组件,因为这个版本号更为人所知。在the Wikipedia article中维护了一个版本号映射表(“MSVC++版本”是Microsoft Visual C++的版本号,即构建工具链)。

您可以在 IDE 中使用您喜欢的任何构建工具链,包括非 Microsoft 工具,这些工具需要它们自己的运行时可再发行组件。同样,您可以从另一个 IDE 调用 Microsoft 的构建工具,在这种情况下,您仍然需要 Microsoft 的可再发行组件。

或者,您可以使用静态链接将运行时库直接集成到您的可执行文件中,在这种情况下,您根本不需要可再发行组件。但这有一个明显的缺点,即您的应用程序不会从运行时库的任何安全更新中受益。您需要重新编译并重新部署您的可执行文件以获取这些安全更新。

【讨论】:

  • 只是为了检查我的理解,您是说当我们下载 C++ 可再发行组件时,我们正在下载使用编译器 X 生成 .dll 的标准库的编译版本。在我们的 IDE 中,我们必须使用编译器 X,以便在编译我们的源代码时,它可以链接到我们下载的 .dll(可再发行)?这里的重点是,您在 IDE 中使用的编译器与用于在可再发行组件中生成 .dll 的编译器相同。
【解决方案2】:

可再发行包并不真正适用于 IDE。它们用于编译器。各种版本的cl 需要特定的库支持。

因此,如果任何 IDE 调用 Microsoft cl 编译器应用程序并使用该编译器的包,您就可以使用它。

或者您可以做相反的事情并通过使用 mingw / mingw-w64 / MSYS2(即 GCC 和其他针对预安装的 Windows 运行时库编译的 Unix 工具)来避免这些包。

【讨论】:

  • 默认情况下,mingw-w64 二进制文件也有 DLL 依赖项。在这两种情况下,都可以进行单片静态构建。如果您不进行静态构建,则必须使用 mingw-w64 构建的可执行文件部署这些 DLL
  • 只是为了检查我的理解,您是说当我们下载 C++ 可再发行组件时,我们正在下载使用编译器 X 生成 .dlls 的标准库的编译版本。在我们的 IDE 中,我们必须使用编译器 X,以便在编译我们的源代码时,它可以链接到我们下载的 .dll(可再发行)?这里的重点是,您在 IDE 中使用的编译器与用于在可再发行组件中生成 .dll 的编译器相同。
  • @Joe 如果您选择 Visual Studio 17 的 C++ 编译器,那么您需要 17 的 DLL。否则它将不支持 C++ std::string 和其他东西的更新版本。我还尝试展示如何改用 UCRT 来避免使用 redist 包。或者 mingw,但是是的,你那里也有库,我想我总是静态链接的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-08
  • 2012-01-03
  • 2019-05-25
  • 1970-01-01
  • 1970-01-01
  • 2019-02-25
  • 1970-01-01
相关资源
最近更新 更多