目前 Windows 有两种 C 运行时:所有 NT 版本都有的 MSVCRT(msvcrt.dll)和最低支持 Vista 的 UCRT(ucrtbase.dll)。在使用 MSVC 时,还会引入主版本关联的 VC++ Runtime(msvcpXXX.dll,vcruntimeXXX.dll)现在有几个问题:
- UCRT 会有更好的性能吗?无需支持 XP 的话选择链接 UCRT 有什么缺点吗?
- 使用 MSVC 或者 MSYS2 ( mingw64/ucrt64/clang64)编译的程序必须链接以上两个 CRT 之一,据说是因为这部分跟系统有较深耦合无法避免,那为什么 golang 可以做到不依赖 CRT ?
- 在保证导出 API 函数都是 C 风格时,可以安全混用两种 CRT 吗?例如链接 UCRT 的 exe 加载链接 MSVCRT 的 dll ,或者链接 MSVCRT 的 exe 加载链接 UCRT 的 dll ?
- 如果我希望给别人用的 dll 有较好的兼容性,在保证导出 API 函数都是 C 风格时,可以将 VC++ Runtime 静态链接进 dll 吗?如果可以,怎么配置?
- 在保证导出 API 函数都是 C 风格时,可以在一个 exe 中安全混用依赖不同主版本 VC++ Runtime 的 dll 吗?