【问题标题】:GCC runtime libraries vs Microsoft Visual C++ runtime redistributablesGCC 运行时库与 Microsoft Visual C++ 运行时可再发行组件
【发布时间】:2015-12-19 04:24:56
【问题描述】:

谁能解释一下 C++ 库的版本控制和分布

  • GCC 库 (libgcc, libstdc++,..?)
  • Microsoft Visual C++ 运行时库(6.0、2005、2008、2010、2012、2013、2015 ......)

由于我对 GCC 编程的了解有限,我从未见过 C++ 运行时库与程序一起分发。 MS Windows 程序经常出现这种情况。

相对较旧的 linux 系统能否运行较新的 C++14 程序(在较新的系统上编译然后复制到旧系统)?

GCC 程序员是否将运行时库与程序一起分发?如果不是,为什么 Windows 程序分发它们? GCC 发行版如何确保 C++ 程序在安装时始终运行?

Qt 等框架怎么样,Qt 如何处理 Linux 和 Windows 上的版本控制和分发? Qt 是否也为不同版本分发运行时?

可能与平台、Linux 的设计方式与 Windows 的设计方式有关。

GCC 和 MS Windows 采用的方法有什么根本不同?

【问题讨论】:

  • “根本区别”是 gcc 试图保留版本之间的二进制接口。 Microsoft 在每个版本中都提供了一组全新的库。这两种方法都有其优点和局限性。例如,引入破坏界面的更改有多难?用户需要多久安装一次新版本?
  • GCC 有很多错误,我相信其中很多都处于接口级别,并且通常需要更改接口来解决它们,您将如何“保留”版本之间的二进制接口。
  • @BoPersson 如果我没记错的话,微软和 linux 的方法比这更相似。 MSVC 运行时 DLL 也有不同的版本,具有相同的接口和相同的“发行版”,并随补丁一起分发。而且linux还有一个“发布”版本,可以打破界面,系统中有多个SO文件。
  • @user1 通常在 linux 上,您的二进制文件将无法工作,因为不存在正确的运行时,并且安装它并非易事。在 Windows 上,如果您安装了正确的运行时可再发行组件,则可以使其工作。
  • @rubenvb 当然,这就是向后兼容性。总的来说,如果您在较旧版本的发行版上编译二进制文件并尝试在较新的发行版上运行它,那么一切都会奏效。 Windows 也是如此 - 将二进制文件编译到较旧的运行时,较新的 windows 版本将安装旧运行时,或者您可以轻松安装它。不过,这里的问题是在旧系统上运行更新的二进制文件。在这种情况下,旧系统上不存在新运行时,在旧系统上安装新运行时并非易事。

标签: c++ c qt visual-c++ gcc


【解决方案1】:

GCC 的运行时库,如 GNU 的 C 库,提供稳定的二进制接口(小脚注:GCC 5.1 有点搞砸了,因为必须实现新的 C++ 特性)。 微软的库没有,每个小的版本差异都可能并且可能会破坏 ABI(应用程序二进制接口)。 此外,Microsoft 编译器也会通过版本增量更改其 ABI,因此将由不同版本的工具构建的代码组合起来是个坏主意。同样在这里,GCC 维护了一个严格的 ABI,这使得目标代码完全兼容(当然,如果没有给出破坏 ABI 的 codegen 选项)。

此 ABI 由编译器在生成代码时使用的对象大小和布局组成。因此,运行针对一个版本构建但在运行时使用不同版本的代码可能会产生意想不到的结果,因为内存布局和使用方式不同。

GNU/Linux 在这方面非常强大,并且通常能够保持强大的向后兼容性。 只要编译的程序是针对库的较旧版本编译的,如果加载用户已安装的较新版本,它将完美运行。 Qt 也是如此,它只会破坏主要版本号之间的 ABI(Qt 4 和 Qt 5 不能在运行时互换)。

有一些小例外,GCC 5 的 libstdc++ 在那里是个大问题。我知道没有大的 glibc ABI 破损。 新的 Microsoft Universal CRT 试图通过提供稳定的 C 运行时接口来解决这个问题,并且正如我们所相信的那样,提供了 glibc 样式库 ABI 稳定性。此 UCRT 可用于 Windows Vista 及更高版本,但需要专门针对此编译应用程序。第一个具有此功能的 VS 版本是 VS2015。

【讨论】:

  • 请注意,OP 还询问前向兼容性,而不仅仅是向后兼容性。
  • @nos 我不谈论向后兼容性,因为没有(保证)。
  • @nos,为什么在 linux 上安装运行时并不简单?
  • @user1 因为没有可以安装的预构建运行时,所以您必须自己构建运行时 - 通常针对特定发行版/版本,并且没有巧妙的方法来拥有安装了并行运行时,因此您必须想出某种解决方法/破解来让您的应用程序使用与默认运行时不同的运行时。运行时还与您可能正在使用的几乎所有库相关联,因此您可能无法将安装在 linux 发行版上的任何库与非默认运行时一起使用。
猜你喜欢
  • 1970-01-01
  • 2012-01-17
  • 1970-01-01
  • 2011-01-09
  • 1970-01-01
  • 2020-09-05
  • 2010-12-07
  • 2010-12-08
  • 1970-01-01
相关资源
最近更新 更多