为什么C++标准库与编译器捆绑在一起而不是os?

Nli*_*tis 25 c c++

如果这是一个天真的问题,我很抱歉,但是我无法理解这些问题.

为什么C++标准库与不同的编译器实现(g++'s libstdc++clangs libc++)捆绑在一起而不是捆绑在一个(类UNIX)操作系统上,就像C标准库那样?为什么它不与C库一起维护,考虑到它是它的超集?

Chr*_*odd 18

基本原因是没有标准的C++ ABI - 每个编译器都倾向于拥有自己的ABI,它与其他编译器的ABI不同并且不兼容.另一方面,大多数操作系统定义了他们使用的标准C ABI并为其提供标准C库,并且该操作系统的所有C编译器都支持该ABI.

  • 实际上,Herb Sutter(来自微软)推动使用类似于C的模型为C++获得稳定的ABI,参见[n4028:定义可移植的C++ ABI](https://isocpp.org/blog/2014)/05/n4028). (2认同)

Var*_*der 10

操作系统通常不支持语言.他们只支持自己的系统调用.在大多数操作系统中,此支持作为C库的一部分提供,因为C具有最低级别的链接.其他语言和运行时(例如C++,python等)在OS的系统调用支持库之上构建其运行时支持.


rub*_*nvb 9

C库也是单独维护的:glibc和Windows的msvcr*(不知道Mac上的细节)."随操作系统提供"的事实是所有(大多数)二进制文件都与它相关联,因此没有它就没有任何工作.当然,可以说C++标准库也是如此,但并不是那么严格.

编译器经常提供库编写者用来促进开发的扩展.实现新功能时,将调整库.有时这些变化正在破裂.对于glibc/libstdc ++(/ libc ++?),库内部保持向后兼容性(使用版本化符号).对于Windows的CRT,C和C++标准库中出现了各种不兼容的版本,并与每个编译器版本相关联.另外:在Visual Studio的情况下,编译器往往会破坏版本之间的ABI,因此"操作系统"必须与所有版本的库一起提供.

PS:授予,对于Windows,在Windows Update中包含较新的CRT/C++ lib版本可能更"干净".其他选择在回到过去的时候已经回归,并且大部分都被困住了.