`msvcrt.dll` 上的 MinGW / MinGW64 链接和依赖

MinGW / MinGW64 Linking and Dependency on `msvcrt.dll`

我正在 MinGW 中为 WinAPI 编码

我还没有完全理解的一件事是 VC 可再分发, 我有一大堆问题

有人说这样的程序需要 msvcrt.dll

  1. bot c++ 和 c 编译需要同一个库吗?
  2. 这是否适用于所有客户目标?
  3. 我必须重新分发它吗?我可以重新分配它吗?
  4. 我可以轻松摆脱这种外部依赖吗?
  5. 有没有其他编译器可以让我不携带这种令人不快的外部依赖? (我隐约记得听说它有问题 - 我听说它可能不是核心系统库,或者它不能免费使用和重新分发库)

我发现这里有问题,因为我想生成没有依赖性的小 exe 文件,只调用系统 WinAPI,如果我使用 一些像 C 标准库函数函数我更喜欢它经济和静态编译,而不是任何第三方依赖项

  1. MSVCRT.DLL主要包含C运行时间,而MinGW只能使用C部分。 C++二进制代码一般不能跨编译器使用。
  2. 这取决于你的"target"。它从 Windows 2000 年开始提供。
  3. 没有。不。它是 Microsoft 专有代码,每个 Windows 版本都有稍微不同的版本。
  4. 没有。我不知道有成熟的替代 C 运行-time DLL。
  5. 你不需要担心依赖,因为它随处可用。 (请注意,这并不是一个很好的 运行 时间,尤其是关于多字节字符。)

Microsoft 编译器可以 link 使用 "static" 库,因此生成的可执行文件仅依赖于 kernel32.dll、user32.dll 等系统 DLL。MinGW 无法做到这一点(还没有)。

编辑:MSVCRT.DLL 问题的简明描述是 here

根据此处的 MS 白皮书:

http://www.microsoft.com/en-gb/download/details.aspx?id=13350

您可以重新分发 Visual Studio 组件的某些部分。

Some software, such as the Microsoft .NET Framework, can be distributed. Components of software products included in MSDN subscriptions that can be distributed (either within an application or as separate files) without royalty are identified in the REDIST.TXT file associated with the product. Components that can be distributed to non-Microsoft platforms are identified in the OTHER-DIST.TXT file associated with the product. Code identified as distributable that has the extension .lib cannot be directly distributed; it must be linked into the application. However, the resulting output can be distributed.

You may also:

  • Modify and distribute source code and objects for code marked as “sample” or “Code Snippet”.
  • Distribute the unmodified output of Microsoft Merge Modules for use with an application's .msi file.
  • Distribute the MDAC_TYP.EXE file containing core data access components (such as the Microsoft SQL Server OLE DB provider and ODBC driver).
  • Distribute the object version of C++ libraries (Microsoft Foundation Classes, Active Template Libraries, and C runtimes).

MS 还专门为开发人员制作了一个可再分发的软件包:http://www.microsoft.com/en-gb/download/details.aspx?id=40784

所以,回答你的问题:

  1. 是的。尽管它是 "purely C",但它也包含 C 的 C++ 部分使用的基本函数,例如文件 I/O、时间和日期函数、数学函数等。
  2. 在情理之中。参见上文 link。
  3. 不,是的。如上所述:您可以选择只对客户说 "you need to download an install this package",但许可证应允许您随产品免费分发它。
  4. 取决于您调用什么 "easily" 以及您的代码具体使用了库的哪些部分。有些功能可能很容易替换,有些则不然 - 但从 "yes, just go do http://www.example.com/msvcrt.dll-plugin-replacement" 的意义上来说这并不容易 - 它需要提出一些替换代码。 MinGW 不带有自己的 C 库的原因是,为您可能需要的所有 windows 功能编写一个替代品并非完全微不足道...
  5. 见上文 - 如果这很容易,早就有人做到了。可能有一些编译器带有自己的库,但它可能不是免费的并且可以免费分发(我不知道有任何产品不依赖 MSVCRT.DLL - 但也不是不可能存在)