如果这是一个天真的问题,我很抱歉,但是我无法理解这些问题.
为什么C++标准库与不同的编译器实现(g++
's libstdc++
和clang
s libc++
)捆绑在一起而不是捆绑在一个(类UNIX)操作系统上,就像C标准库那样?为什么它不与C库一起维护,考虑到它是它的超集?
Chr*_*odd 18
基本原因是没有标准的C++ ABI - 每个编译器都倾向于拥有自己的ABI,它与其他编译器的ABI不同并且不兼容.另一方面,大多数操作系统定义了他们使用的标准C ABI并为其提供标准C库,并且该操作系统的所有C编译器都支持该ABI.
Var*_*der 10
操作系统通常不支持语言.他们只支持自己的系统调用.在大多数操作系统中,此支持作为C库的一部分提供,因为C具有最低级别的链接.其他语言和运行时(例如C++,python等)在OS的系统调用支持库之上构建其运行时支持.
C库也是单独维护的:glibc和Windows的msvcr*(不知道Mac上的细节)."随操作系统提供"的事实是所有(大多数)二进制文件都与它相关联,因此没有它就没有任何工作.当然,可以说C++标准库也是如此,但并不是那么严格.
编译器经常提供库编写者用来促进开发的扩展.实现新功能时,将调整库.有时这些变化正在破裂.对于glibc/libstdc ++(/ libc ++?),库内部保持向后兼容性(使用版本化符号).对于Windows的CRT,C和C++标准库中出现了各种不兼容的版本,并与每个编译器版本相关联.另外:在Visual Studio的情况下,编译器往往会破坏版本之间的ABI,因此"操作系统"必须与所有版本的库一起提供.
PS:授予,对于Windows,在Windows Update中包含较新的CRT/C++ lib版本可能更"干净".其他选择在回到过去的时候已经回归,并且大部分都被困住了.