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

时间:2019-08-16 17:02:06

标签: mingw-w64 universal-crt

我希望能够使用mingw-w64构建链接到Visual Studio 2015+而不是MSVCRT.lib的Universal CRT的二进制文件。 release notes for mingw-w64 v6.0.0包括以下内容:“感谢MartinStorsjö,为支持UCRT提供了许多补充”

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

有人知道我需要提供哪些选择以及在哪里提供这些选择吗?

1 个答案:

答案 0 :(得分:1)

嗯,我已经完成了 VS 2017 。但是据我了解, VS 2015 VS 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 $4}' >> vcruntime140.def
lib /def:vcruntime140.def /out:libvcruntime140.a /machine:x86
cp libvcruntime140.a $(MINGW_ROOT)/i686-w64-mingw32/lib

2。更改 MinGW GCC 的操作方式以链接到VCRUNTIME140UCRT而不是MSVCRT

gcc -dumpspecs > $(MINGW_ROOT)/lib/gcc/i686-w64-mingw32/$(GCC_VERSION)/specs
  1. 在规范文件的-D_UCRTcpp部分中添加cc1plus。这将防止scanf函数系列的未定义引用链接错误。检查我的其他question
  2. 在规格文件-lmsvcrt部分中将-lvcruntime140 -lucrt替换为libgcc

请与您拥有 MinGW 的位置交换$(MINGW_ROOT)

注意:

  • 在我包含的路径中,平台签名部分i686-w64-mingw32对于您的情况可能有所不同。我相信基于架构。因此,您可能需要进行相应的修改。
  • 您需要使用相对较新的 MinGW ,它在 $(MINGW_ROOT)/ i686-w64-mingw32 / lib 文件夹中有libucrt.a。我正在将 MinGW 7.3.0 GCC 7.4.0 一起使用。