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