如何使用mingw-w64构建UCRT?

如何使用mingw-w64构建UCRT?,mingw-w64,universal-crt,Mingw W64,Universal Crt,我希望能够使用mingw-w64构建二进制文件,链接到Visual Studio 2015+提供的通用CRT,而不是MSVCRT.lib。其中包括以下内容:由于Martin Storsjö,大量增加了对UCRT的支持 不幸的是,我的搜索没有显示有关如何使用此支持的文档 有人知道我需要提供哪些选项以及在哪里提供吗?好吧,我和VS 2017一起做过。但据我所知,VS 2015和VS 2017都使用VCRUNTIME140.DLL,所以这里不用担心 它分为两个步骤: 1.正在为VCRUNTIME140

我希望能够使用mingw-w64构建二进制文件,链接到Visual Studio 2015+提供的通用CRT,而不是MSVCRT.lib。其中包括以下内容:由于Martin Storsjö,大量增加了对UCRT的支持

不幸的是,我的搜索没有显示有关如何使用此支持的文档


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

好吧,我和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的操作方式,以链接VCRUNTIME140和UCRT,而不是MSVCRT 将-D_UCRT添加到规范文件的cpp和cc1plus部分。这将防止scanf函数系列的未定义引用链接错误。检查我的另一个。 将specs文件的libgcc部分中的-lmsvcrt替换为-lvcruntime140-lucrt。 请将$MINGW_ROOT与您拥有MINGW的位置交换

注:

我包含的路径中的平台签名部分i686-w64-mingw32可能因您的情况而有所不同。我相信基于架构。因此,您可能需要相应地修改它。 您需要使用一个相对较新的MinGW,它在$MinGW_ROOT/i686-w64-mingw32/lib文件夹中具有libucrt.a。我正在使用mingw7.0.0和gcc7.4.0。
好吧,我已经和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的操作方式,以链接VCRUNTIME140和UCRT,而不是MSVCRT 将-D_UCRT添加到规范文件的cpp和cc1plus部分。这将防止scanf函数系列的未定义引用链接错误。检查我的另一个。 将specs文件的libgcc部分中的-lmsvcrt替换为-lvcruntime140-lucrt。 请将$MINGW_ROOT与您拥有MINGW的位置交换

注:

我包含的路径中的平台签名部分i686-w64-mingw32可能因您的情况而有所不同。我相信基于架构。因此,您可能需要相应地修改它。 您需要使用一个相对较新的MinGW,它在$MinGW_ROOT/i686-w64-mingw32/lib文件夹中具有libucrt.a。我正在使用mingw7.0.0和gcc7.4.0。
mingw-w64使用的gcc不与msvcrt专有链接。@Biswapriyo-我知道在mingw-w64的过去版本中是这样的,但问题中链接的最新版本的发行说明提到了UCRT支持。我实际上没有尝试过,但在。$gcc-mcrtdll=UCRT上有一些信息。。。用于针对UCRT进行链接,但该选项未定义任何_UCRT*宏。mingw-w64使用的gcc不与msvcrt专有链接。@Biswapriyo-我知道在mingw-w64的过去版本中是这样的,但问题中链接的最新版本的发行说明提到了UCRT支持。我实际上没有尝试过,但是,$gcc-mcrtdll=ucrt上有一些信息。。。用于针对UCRT进行链接,但该选项未定义任何_UCRT*宏。关于这一点,请注意:1您不需要使用vcruntime140.dll,因此可以跳过整个步骤1。只要去掉-lvcruntime140,-lucrt就足够了。vcruntime140.dll不是UCRT本身的一部分,但可以与应用捆绑在一起,也可以在编译C代码时安装在系统目录2中,也可以不安装在系统目录2中的某个位置,并且不链接默认libmingw32.a和libmingwex.a之外的任何预建静态库。这很有效,但是,其他预构建库可能依赖于不同CRT版本之间显著不同的细节。特别是-libstdc++可能在很大程度上依赖于它为之构建的CRT,因此您不能使用为msvcrt.dll构建的预构建libstdc++并将其与UCRT链接。或者,它可能会起作用,并产生棘手的潜在bug。因此,如果您不使用包括libstdc++在内的预构建库并从头开始构建所有其他库,那么添加-D_UCRT并用-lucrt替换-lmsvcrt的方法是有效的。最安全的方法是从头开始重新构建整个工具链,并将默认的msvcrt=ucrt传递给mingw-w64-headers和mingw-w64-crt。是的,我已经使用默认的msvcrt=ucrt构建了mingw-crt和headers,并在编译GCC期间使用它们,以及我后来添加的所有LIB。关于vcruntime140是的,这是不必要的。关于这一点,需要注意两点:1您不需要使用vcruntime140.dll,因此可以跳过整个步骤1。只要去掉-lvcruntime140,-lucrt就足够了。vcruntime140.dll不是作为UCRT本身的一部分提供的,但可以与应用程序捆绑在一起,也可以在编译C代码时安装在系统目录2中的某个位置,也可以不安装,并且不链接任何预构建的
默认libmingw32.a和libmingwex.a之外的静态库,但是,其他预构建库可能依赖于不同CRT版本之间显著不同的细节。特别是-libstdc++可能在很大程度上依赖于它为之构建的CRT,因此您不能使用为msvcrt.dll构建的预构建libstdc++并将其与UCRT链接。或者,它可能会起作用,并产生棘手的潜在bug。因此,如果您不使用包括libstdc++在内的预构建库并从头开始构建所有其他库,那么添加-D_UCRT并用-lucrt替换-lmsvcrt的方法是有效的。最安全的方法是从头开始重新构建整个工具链,并将默认的msvcrt=ucrt传递给mingw-w64-headers和mingw-w64-crt。是的,我已经使用默认的msvcrt=ucrt构建了mingw-crt和headers,并在编译GCC期间使用它们,以及我后来添加的所有LIB。关于vcruntime140是的,不需要。