GCC运行时库与Microsoft Visual C++运行时可再发行组件

21

请问有人能够解释一下C++库版本控制和分发的问题吗?

  • GCC库(包括libgcc、libstdc++等)
  • Microsoft Visual C++运行库(6.0、2005、2008、2010、2012、2013、2015等)

以我有限的GCC编程经验,我从未见过C++运行库随程序一起分发。而这在Windows程序中经常出现。

一个比较老的Linux系统能否运行一个较新的C++14程序(该程序是在新系统上编译然后复制到旧系统上的)?

GCC程序员是否会随程序一起分发运行库?如果不会,为什么Windows程序会这样做?如何确保GCC分发时C++程序总是可运行的?

对于像Qt这样的框架,它如何处理Linux和Windows上的版本控制和分发?Qt是否也会针对不同版本分发运行库?

也许这与平台有关,Linux的设计方式与Windows的设计方式存在根本的不同。

那么GCC和MS Windows采取的方法有什么根本的区别呢?


如果我没记错的话,微软和Linux的方法比你想象的更相似。MSVC运行时DLL也有不同版本,但接口相同,在同一个“发布”中分发补丁。而Linux也有一个“发布”版本,可能会破坏接口,并在系统中使用多个SO文件。 - ElderBug
在MSVC中,查找安装媒体并搜索“redist”。例如,MSVC 2015社区版附带了当前(和最近3个)版本的MSVC的分发包。然后,您可以将所需的分发包包含到您选择的安装程序中。 - Richard Critten
1
@user1 通常在Linux上,由于缺少正确的运行时环境,您的二进制文件无法正常工作,并且安装它并不容易。而在Windows上,如果您安装了适当的运行时环境分发包,就可以使其正常工作。 - nos
1
@rubenvb 当然,这就是向后兼容性。总的来说,如果您在旧版本的发行版上编译二进制文件,并尝试在新版本的发行版上运行它,则大多数情况下都可以正常工作。Windows也是如此-将二进制文件编译为旧的运行时,新的Windows版本将安装该旧的运行时,或者您可以轻松安装它。但问题在于,在旧系统上运行新的二进制文件。在这种情况下,旧系统上不存在新的运行时,并且在旧系统上安装新的运行时并不容易。 - nos
@nos 从这里的评论中并不清楚你到底在回应什么(而且你的评论相当泛泛)... 你是在试图回答问题吗?如果是,请写一个答案,而不是一个评论。 - rubenvb
显示剩余4条评论
1个回答

14

GCC的运行时库,如GNU的C库,提供了一个稳定的二进制接口(注:由于必须实现新的C ++功能,因此GCC 5.1有些破坏了这个接口)。 Microsoft的库则不然,每个小版本差异都可能会破坏ABI(应用程序二进制接口)。 此外,微软编译器也会随着版本的增长而改变其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 我不谈论向后兼容性,因为这是没有保证的。 - rubenvb
@nos,为什么在Linux上安装运行时是不容易的? - user1
1
由于没有现成的运行时可以安装,所以您必须自己构建运行时——通常是针对特定的发行版/版本,并且没有简单的方法来安装并行运行时,因此您需要想出某种解决方法/黑科技来使您的应用程序使用不同的运行时而不是默认值。运行时还与您可能正在使用的几乎所有库相关联,因此您可能无法与非默认运行时一起使用安装在Linux发行版上的任何库。 - nos

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