--- mingw-w64-crt/configure.ac | 4 +- mingw-w64-doc/howto-build/ucrt-vs-msvcrt.txt | 58 ++++++++++++++++++++ mingw-w64-headers/configure.ac | 12 ++-- 3 files changed, 66 insertions(+), 8 deletions(-) create mode 100644 mingw-w64-doc/howto-build/ucrt-vs-msvcrt.txt
diff --git a/mingw-w64-crt/configure.ac b/mingw-w64-crt/configure.ac index 05f40b261..ced7745ca 100644 --- a/mingw-w64-crt/configure.ac +++ b/mingw-w64-crt/configure.ac @@ -267,9 +267,9 @@ AC_MSG_RESULT([$enable_delay_import_libs]) AC_MSG_CHECKING([what to provide as libmsvcrt.a]) AC_ARG_WITH([default-msvcrt], [AS_HELP_STRING([--with-default-msvcrt=LIB], - [Lib to provide as libmsvcrt.a (default: msvcrt-os)])], + [Lib to provide as libmsvcrt.a (default: ucrt)])], [], - [with_default_msvcrt=msvcrt-os]) + [with_default_msvcrt=ucrt]) if test "$with_default_msvcrt" = "msvcrt"; then with_default_msvcrt=msvcrt-os fi diff --git a/mingw-w64-doc/howto-build/ucrt-vs-msvcrt.txt b/mingw-w64-doc/howto-build/ucrt-vs-msvcrt.txt new file mode 100644 index 000000000..3cc3329ad --- /dev/null +++ b/mingw-w64-doc/howto-build/ucrt-vs-msvcrt.txt @@ -0,0 +1,58 @@ +== Summary == + +Starting from mingw-w64 version 12 and onwards, UCRT (Universal C Runtime) will +be the default CRT runtime, unless specified otherwise during the minwgw-64 +build process. We believe that this configuration is the best choice for the +majority of users. While we encourage users to consider switching to UCRT, we +understand that it may not always be desirable, especially for compatibility +reasons. Therefore, all previously supported configurations will continue to +be supported. Users who wish to continue using msvcrt.dll can easily do so by +adding the --with-default-msvcrt=msvcrt argument to both the +mingw-w64-headers and mingw-w64-crt configure scripts. + + +== Background == + +mingw-w64 provides C runtime libraries that directly or indirectly utilize +Microsoft DLLs at runtime. Over the years, Microsoft has released various +versions of these DLLs, some of which were designed for specific MSVC versions +while others aimed for backward compatibility. When building the mingw-w64 +toolchain, users can specify a version of the runtime DLL using the +--with-default-msvcrt= configure option. The most commonly used versions are +ucrt (utilizing ucrtbase.dll) and msvcrt (utilizing msvcrt.dll). + +The implementation of msvcrt.dll dates back to the Windows 9x era. While it has +been extended for a period, it eventually became frozen in favor of providing +separate DLLs for future MSVC versions. Although msvcrt.dll continues to be +shipped with modern Windows versions, it remains compatible with the version +from the 1990s. msvcrt.dll is known to deviate from standard behavior in many +aspects. mingw-w64 includes compatibility wrappers and extensions to improve +standard compatibility, but there are limitations to what can be practically +achieved. + +On the other hand, ucrtbase.dll was introduced with MSVC 14 and is currently +included with all Windows versions supported by Microsoft. It is also available +as a redistributable package for older versions of Windows. ucrtbase.dll aims to +replace MSVC version-specific DLLs and has been used by all MSVC versions since +its introduction. It offers a more modern approach compared to msvcrt.dll and +provides better standard compatibility out of the box, reducing overhead on the +mingw-w64 side. + + +== Compatibility == + +When switching between toolchains that use different runtime libraries, it is +generally advised not to mix static libraries, unless certain exceptions apply. +If in doubt, it is recommended to rebuild all static libraries when switching +the toolchain's runtime DLL. + +Dynamic libraries are less likely to be affected. If the CRT is not part of the +ABI of a library you intend to use, meaning it does not involve passing FILE +structs or similar types between modules or depending on the CRT allocator of +other modules, it should remain unaffected. Otherwise, a compatible build of +that library will be required. + + +== See Also == + +"MSVCRT vs UCRT": https://www.msys2.org/docs/environments/ diff --git a/mingw-w64-headers/configure.ac b/mingw-w64-headers/configure.ac index d82280cd7..d6809d147 100644 --- a/mingw-w64-headers/configure.ac +++ b/mingw-w64-headers/configure.ac @@ -144,9 +144,9 @@ AC_SUBST([DEFAULT_WIN32_WINNT]) AC_MSG_CHECKING([default msvcrt]) AC_ARG_WITH([default-msvcrt], [AS_HELP_STRING([--with-default-msvcrt=LIB], - [Default msvcrt to target (default: msvcrt)])], + [Default msvcrt to target (default: ucrt)])], [], - [with_default_msvcrt=msvcrt]) + [with_default_msvcrt=ucrt]) case $with_default_msvcrt in msvcrt10*) default_msvcrt_version=0x100 @@ -178,12 +178,12 @@ msvcr110*) msvcr120*) default_msvcrt_version=0xC00 ;; -ucrt*) - default_msvcrt_version=0xE00 - ;; -msvcrt|*) +msvcrt*) default_msvcrt_version=0x700 ;; +ucrt*|*) + default_msvcrt_version=0xE00 + ;; esac AC_MSG_RESULT([$with_default_msvcrt ($default_msvcrt_version)]) AS_VAR_SET([DEFAULT_MSVCRT_VERSION],[$default_msvcrt_version])
_______________________________________________ Mingw-w64-public mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/mingw-w64-public
