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

use*_*er1 15 c c++ qt gcc visual-c++

任何人都可以了解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采用的方法有何根本不同?

rub*_*nvb 12

GCC的运行时库,如GNU的C库,提供了一个稳定的二进制接口(小脚注:由于必须实现新的C++特性,GCC 5.1类型的爆炸性).微软的库没有,每个小版本的差异可能也可能会打破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.