c++ - 为什么依赖MinGW dll?
问题描述
我已经在 Windows 上的 Eclipse 上使用 g++ 6.3.0-1 编译了 Hello World。如果找不到以下 dll,则可执行文件不会运行:
- libgcc_s_dw2-1.dll
- libstdc++-6.dll
这是我的 Hello World 程序的代码:
#include <iostream>
using namespace std;
int main() {
cout << "!!!Hello World!!!\n"; // prints !!!Hello World!!!
return 0;
}
据我了解,MinGW 会尽可能地尝试链接 MS 的标准 dll。为什么它会链接到自己的 dll 以获取像 iostream 这样微不足道的东西?在 MS 的库中找不到的 MinGW 库中的 iostream 需要什么?
解决方案
<iostream>
这当然不是微不足道的:标准 C++ I/O 系统本身并不太复杂,但它的使用std::locale
及其方面相当复杂。因此,它内置于共享库中。这样做的部分原因是生成的可执行文件可以作为非开源程序发布:libstdc++
被 LGPL 覆盖,只能通过共享对象用于非开源程序。
由于 I/O 和语言环境子系统使用 C++ 接口并且没有平台 C++ ABI 使用系统实现不是一个选项。据我所知,微软没有发布它的 C++ ABI,至少在过去的某个时候它使用了专利技术来防止其他编译器瞄准它。因此 gcc 使用的 C++ ABI 与 MSVC++ 不兼容。请注意,定义了一个可以使用的 C ABI。
推荐阅读
- c# - 有没有办法在 C# 中获取击键的时间戳?
- r - 返回数据框中所有考试都超过某个值的学生姓名
- mysql - 如果使用内部连接 MySql?
- r2dbc - 批量插入支持
- javascript - 在 TypeScript 中使用泛型
- c# - Graph API - 使用 .Net Core 3.1 添加模式扩展
- java - Pluggable Type Checkers 和 Checkers 框架,真的需要所有这些设置吗?
- redux - Redux:未捕获的错误:操作可能没有未定义的“类型”属性。你有没有拼错一个常数?
- swift - 使用 webview 后如何使用 segue?
- javascript - 用于创建具有可选属性的简单节点的函数