如何使用 mingw-w64 针对 UCRT 进行构建?

How do I build against the UCRT with mingw-w64?

我希望能够使用 mingw-w64 构建 link 到 Visual Studio 2015+ 而不是 MSVCRT.lib 可用的通用 CRT 的二进制文件。 release notes for mingw-w64 v6.0.0 包括以下内容:"Massive additions to support UCRT thanks to Martin Storsjö"

很遗憾,我的搜索没有显示有关如何使用此支持的文档。

有谁知道我需要提供什么选项以及在哪里提供它们?

嗯,我是跟着VS 2017一起搞定的。但据我了解 VS 2015VS 2017 都使用 VCRUNTIME140.DLL,所以不用担心。

分为两步:

1。为 VCRUNTIME140.DLL 创建导入库:

这是通过执行以下操作完成的:

mkdir scratch; cd scratch
cp C:/Windows/System32/vcruntime140.dll .
dumpbin /exports vcruntime140.dll > exports.txt
echo LIBRARY VCRUNTIME140 > vcruntime140.def
echo EXPORTS >> vcruntime140.def
tail +20 exports.txt | head -n -10 | awk '{print }' >> vcruntime140.def
lib /def:vcruntime140.def /out:libvcruntime140.a /machine:x86
cp libvcruntime140.a $(MINGW_ROOT)/i686-w64-mingw32/lib

2。将 MinGW GCC 的运行方式更改为 link 而不是 VCRUNTIME140UCRT 而不是 MSVCRT

gcc -dumpspecs > $(MINGW_ROOT)/lib/gcc/i686-w64-mingw32/$(GCC_VERSION)/specs
  1. -D_UCRT 添加到规范文件的 cppcc1plus 部分。这将防止 scanf 函数族的未定义引用 linking 错误。查看我的其他 .
  2. 将规范文件 libgcc 部分中的 -lmsvcrt 替换为 -lvcruntime140 -lucrt

请将 $(MINGW_ROOT) 与您拥有 MinGW.

的位置交换

备注:

  • 我包含的路径中的平台签名部分 i686-w64-mingw32 可能因您的情况而异。我相信基于架构。所以你可能需要相应地修改它。
  • 您需要使用相对较新的 MinGW,它在 $(MINGW_ROOT)/i686-w64-mingw32/lib 中具有 libucrt.a 文件夹。我正在使用 MinGW 7.0.0GCC 7.4.0.