Windows MinGW/MinGW64链接和依赖于`msvcrt.dll`

Windows MinGW/MinGW64链接和依赖于`msvcrt.dll`,windows,linker,mingw,mingw-w64,msvcrt,Windows,Linker,Mingw,Mingw W64,Msvcrt,我正在为MinGW中的WinAPI编写代码 有一件事我还没有完全理解,那就是VC的可再发行性, 我有一大堆问题要问 有人说这样的程序需要msvcrt.dll 是BOT C++和C编译所需的相同库吗? 这是否适用于所有客户目标 我必须重新分配它吗?我可以重新分发吗 我能轻松摆脱这种外部依赖吗 是否有其他编译器允许我不携带这种令人不快的外部依赖?(我模模糊糊地记得听说它有问题——我听说它可能不是核心系统库,或者它不能免费使用和重新分发库) 我发现这里有点不对劲,因为我想只调用系统WinAPI,如果我

我正在为MinGW中的WinAPI编写代码

有一件事我还没有完全理解,那就是VC的可再发行性, 我有一大堆问题要问

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

是BOT C++和C编译所需的相同库吗?<李>
  • 这是否适用于所有客户目标
  • 我必须重新分配它吗?我可以重新分发吗
  • 我能轻松摆脱这种外部依赖吗
  • 是否有其他编译器允许我不携带这种令人不快的外部依赖?(我模模糊糊地记得听说它有问题——我听说它可能不是核心系统库,或者它不能免费使用和重新分发库)
  • 我发现这里有点不对劲,因为我想只调用系统WinAPI,如果我使用 有些函数类似于C标准库函数,我更喜欢它以经济的方式静态编译,而不是任何第三方依赖关系

  • MSVCRT.DLL主要包含C运行时,MinGW只能使用C部分。C++二进制代码通常不能跨编译器使用。
  • 这取决于你的“目标”。它可从Windows 2000获得
  • 不。不。这是微软的专有代码,每个Windows版本都有一个稍微不同的版本
  • 没有。我不知道有成熟的替代C运行时DLL
  • 您不必担心依赖性,因为它无处不在。(请注意,它并不是一个很好的运行时,特别是在多字节字符方面。)
  • Microsoft编译器可以与“静态”库链接,因此生成的可执行文件仅依赖于系统dll,如kernel32.dll、user32.dll等。MinGW还不能做到这一点


    编辑:MSVCRT.DLL问题的简要说明如下。

    根据MS白皮书:

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

    某些软件,如Microsoft.NET Framework,可以 分发。MSDN中包含的软件产品组件 可以分发的订阅(在应用程序内或 REDIST.TXT中标识了不含版税的单独文件 与产品关联的文件。可以分发的组件 在OTHER-DIST.TXT文件中标识到非Microsoft平台 与产品关联。已标识为可分发的代码 extension.lib不能直接分发;它必须是链接的 进入应用程序。但是,结果输出可以是 分发

    你亦可:

    • 修改和分发标记为“示例”或“代码段”的代码的源代码和对象
    • 分发未修改的Microsoft合并模块输出,以便与应用程序的.msi文件一起使用
    • 分发包含核心数据访问组件(如Microsoft SQL Server OLE DB提供程序和ODBC)的MDAC_TYP.EXE文件 司机)
    • < L>分发C++库的对象版本(微软基础类库、活动模板库和C运行时)。
    MS还专门为开发人员提供可再发行的软件包:

    因此,要回答您的问题:

  • 对。虽然它是“纯C”,但它包含C++的C++部分所使用的基本功能,如文件I/O、时间和日期函数、数学函数等等。
  • 在合理的范围内。见上面的链接
  • 不,是的。如上所述:您可以选择只对客户说“您需要下载安装此软件包”,但许可证应允许您在产品中免费分发此软件包
  • 取决于您称之为“轻松”的内容,以及您的代码使用的库的确切部分。有些函数可能很容易替换,有些则不然——但从“是的,就去做吧”的意义上讲,这并不容易——这需要拿出一些替换代码。MinGW没有自己的C库的原因是,为您可能需要的所有windows功能编写一个替换程序并不是一件小事
  • 看上面-如果这是容易的,有人会这样做。可能有一些编译器自带了自己的库,但这可能不是免费的,也不是免费分发的(我不知道有任何产品不依赖MSVCRT.DLL,但它也不是不可能存在的)

  • 回答得好。不管怎样,你能说出你所说的“不是一个真正优秀的运行时”是什么意思吗?你的意思是效率低下?那是我担心的一件事。。如果是这样的话,一些用mingw编译的代码会因此而变得效率低下吗?PS PS这向我澄清了一些事情(great thanx)虽然不是全部,但我不知道编译器做了什么,除了chanelling调用msvcrt.dll,可能他正在做一些事情(例如,如果他正在做一些静态链接,或者只是调用msvcrt.dll来覆盖整个clib)(?)还有这个内置的东西,它必须在msvcrt.dll之外完成,但非常模糊)@user2214913正如我所提到的,存在与多字节字符有关的问题。请参阅此处的讨论:.MinGW对所有基本C函数使用MSVCRT运行时,但Microsoft运行时不支持的函数除外。在这种情况下,存在特定于MinGW的库,如libmingwex.a。答案是否适用于
    MinGW64
    是的。@Royi是的(我想你指的是MinGW-w64).MinGW依赖于预装的msvcrt.dll,可在任何Windows计算机上使用。您不能分发它。您不能替换它,它是受保护的。这确实是一项重大责任,并且没有可行的开源替代方案。还有什么严重妨碍了Clang。这个dll涵盖了什么?是clib还是其他什么?如果这样做会怎么样s是低效的旧废话,这是实现了吗?它可能包含像sin这样的fpu代码,所以它的效率可能很重要