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