== Summary ==

Starting from mingw-w64 version 12 and onwards, UCRT (Universal C Runtime) will
be the default CRT runtime, unless specified otherwise during the mingw-w64
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 UCRT, via api-ms-win-crt-*.dll API set libraries) and
msvcrt (utilizing msvcrt.dll).

Users can also choose crtdll (utilizing system crtdll.dll library which
is a predecessor of msvcrt.dll and is available on all 32-bit Windows versions
starting from NT 3.1, Win32s and Win9x), version-specific msvcr* libraries,
ucrtbase (linking directly against ucrtbase.dll instead of
api-ms-win-crt-*.dll wrappers) and debug mode libraries.

The implementation of msvcrt.dll was introduced with Visual C++ 4.2 in 1996.
As a system library it is included since Windows 98 and NT 4. 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 1996. 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, the UCRT 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. UCRT 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.

Windows 10 and newer systems have UCRT automatically preinstalled.

Windows Vista / Server 2008, Windows 7 / Server 2008 R2, Widows 8 / Server 2012
and Windows 8.1 / Server 2012 R2 systems include UCRT libraries in KB2999226
system update, which is available at website:
https://support.microsoft.com/help/2999226

For Windows XP and Windows Server 2003, the UCRT libraries are provided via
a Visual Studio redistributable package. The latest compatible
version for these systems is the Visual Studio 2019 16.7 redistributable
package, it contains UCRT version 14.27.29114.0 and is available at:
32-bit: https://download.visualstudio.microsoft.com/download/pr/56f631e5-4252-4f28-8ecc-257c7bf412b8/D305BAA965C9CD1B44EBCD53635EE9ECC6D85B54210E2764C8836F4E9DEFA345/VC_redist.x86.exe
64-bit: https://download.visualstudio.microsoft.com/download/pr/722d59e4-0671-477e-b9b1-b8da7d4bd60b/591CBE3A269AFBCC025681B968A29CD191DF3C6204712CBDC9BA1CB632BA6068/VC_redist.x64.exe

Windows 2000 and older systems do not have support for UCRT at all.


== 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/
