MinGW 是如何实现 C++ 库支持的?

How did MinGW implement C++ Library support?

根据我的观察,MinGW 对 C 使用 MSVCRT,对 C++ 使用 libstdc++

如果是这样,他们怎么可能一起工作?而且,为什么不统一 C 和 C++ 支持,无论 MSVCRT + MSVCPRT 还是 glib + libstdc++.

我认为 MSVCRTlibstdc++ 之间的混合听起来很糟糕。那为什么MinGW还是选择这个呢?

链接:


以下是我的观察,如果你能回答问题就跳过吧。

为了编译本机代码Windows(仅使用 Win32 API),
MinGW使用MSVCRT作为底层C运行时库(提供Win32 API),
并从头开始编写桥接层以连接标准 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++ 支持。

我检查了像 iostream 这样的 C++ 头文件,它有这样的横幅

// 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 已经让 libstdc++ 基于 MSVCRT 工作!

这是我的理解,请指正。

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 选择它。