2015-01-15 51 views
3

根据我的观察,MinGW使用MSVCRT用于C,而libstdC++用于C++。MinGW如何实现C++库支持?

如果是这样,他们怎么能一起工作?而且,为什么不统一的C和C++的支持,无论MSVCRT + MSVCPRT油嘴 + 的libstdC++

我觉得MSVCRTmixin之间libstdC++听起来很可怕。那么为什么MinGW仍然选择这个?

链接:


下面是我的观察,如果你能跳过它回答问题。

为了编译为本地Windows代码(仅使用Win32 API的),
MinGW的使用MSVCRT作为底层C运行库(提供的Win32 API),
和为了连接从头WIRTE一个桥接层标准C调用和Win32 API调用。

我检查MinGW中的C头文件,例如stdio.h,它有这样的横幅。

/** 
* This file has no copyright assigned and is placed in the Public Domain. 
* This file is part of the mingw-w64 runtime package. 
* No warranty is given; refer to the file DISCLAIMER.PD within this package. 
*/ 

而且里面的文件,你会发现很多的_CRTIMP,这实际上意味着它会转换成Win32 API调用。

但是对于C++部分来说,它是相当有线的。
MinGW似乎使用libstdC++来实现C++支持。

我检查C++头文件,如iostream,它有这样的

// Standard iostream objects -*- C++ -*- 

// Copyright (C) 1997-2014 Free Software Foundation, Inc. 
// 
// This file is part of the GNU ISO C++ Library. This library is free 
// software; you can redistribute it and/or modify it under the 
// terms of the GNU General Public License as published by the 
// Free Software Foundation; either version 3, or (at your option) 
// any later version. 

当然没有更多_CRTIMP或任何MS风格符号的一面旗帜。
因此,MinGW已经使基于MSVCRT的libstdC++作品!

+4

由于C库充满了系统调用包装,并且这些系统调用依赖于Linux/Hurd。从另一方面来说,C++库几乎是用户空间的东西(支持),并且可以在任何合理的C库之上生存 –

+0

@SeverinPappadeux你提醒我了!我甚至忘记了这样一个基本事实。 – Eugene

+0

gcc不太可能与'msvcprt.dll'兼容。 –

回答

0

这是我的理解,请修理我。

C库的意义远远超过C++库。

C库是从平台依赖system calls到平台独立C calls的桥梁。

C++图书馆从独立于平台的C calls开始,然后添加面向对象的功能并使其更易于使用。

所以不使用glibc的原因远远多于GPL许可证问题,这是因为C库需要制作system calls并与OS进行通信。所以在大多数情况下,它与OS一起出现,并且将成为该平台上唯一可用的C库。

因此,因为C++库是基于C库的,所以它是平台独立的。所以只需使用libstdc++的代码,并自发地在Windows上运行。这也解释了为什么libstdc++可以基于MSVCRT运行。

现在,事情变得更容易,因为libstdc++提供了更好的支持最新的C++标准,MinGW选择。