【问题标题】:How did MinGW implement C++ Library support?MinGW 是如何实现 C++ 库支持的?
【发布时间】:2015-01-15 05:33:46
【问题描述】:

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

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

我认为 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 库中充满了系统调用包装器,并且这些系统调用依赖于 Linux/Hurd。另一方面,C++ 库几乎是用户空间的东西(模 支持),并且可以存在于任何合理的 C 库之上
  • @SeverinPappadeux 你提醒我了!我什至忘记了这样一个基本事实。
  • gcc 不太可能兼容msvcprt.dll
  • @SeverinPappadeux:这对我来说像是一个答案

标签: c++ windows mingw libstdc++ msvcrt


【解决方案1】:

这是我的理解,请纠正我。

C 库的意义远不止 C++ 库。

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

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

所以不使用 glibc 的原因远不止 GPL 许可问题,因为 C 库需要制作system calls 并与 OS 通信。所以在大多数情况下,它与操作系统一起提供,并且将是平台上唯一可用的 C 库。

因此,由于 C++ 库是基于 C 库的,所以它是平台无关的。因此,只需使用来自libstdc++ 的代码,它就会自然而然地在 Windows 上运行。它还解释了为什么libstdc++ 可以基于MSVCRT 运行。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多