MinGW 是如何实现 C++ 库支持的?
How did MinGW implement C++ Library support?
根据我的观察,MinGW 对 C 使用 MSVCRT,对 C++ 使用 libstdc++。
如果是这样,他们怎么可能一起工作?而且,为什么不统一 C 和 C++ 支持,无论 MSVCRT + MSVCPRT 还是 glib + libstdc++.
我认为 MSVCRT 和 libstdc++ 之间的混合听起来很糟糕。那为什么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 选择它。
根据我的观察,MinGW 对 C 使用 MSVCRT,对 C++ 使用 libstdc++。
如果是这样,他们怎么可能一起工作?而且,为什么不统一 C 和 C++ 支持,无论 MSVCRT + MSVCPRT 还是 glib + libstdc++.
我认为 MSVCRT 和 libstdc++ 之间的混合听起来很糟糕。那为什么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 选择它。