链接到 ucrtbase.dll
内容提要
使用VS编译器生成的exe文件依赖于特定版本的msvcrXXX.dll,需附带安装程序。微软推出UCRT解决了这一问题,支持静态C++库动态链接C运行时,从而减小二进制体积。VS2022默认使用UCRT,CMake配置可通过链接动态库实现。
关键要点
-
使用VS编译器生成的exe文件依赖于特定版本的msvcrXXX.dll,需附带安装程序。
-
微软推出UCRT解决了这一问题,支持静态C++库动态链接C运行时。
-
UCRT是微软重写的C运行时,名为ucrtbase.dll和ucrtbased.dll。
-
UCRT允许静态C++库使用动态C运行时,从而减小二进制体积。
-
VS2022默认使用UCRT,CMake配置可通过链接动态库实现。
-
在CMake中启用UCRT的方式是通过add_link_options和link_libraries指令。
-
使用llvm-mingw项目的clang编译器可以实现release版本连接到ucrtbase.dll。
延伸解读
UCRT的优势
UCRT(Universal C Runtime)是微软为解决动态链接库版本依赖问题而推出的解决方案。与传统的msvcrXXX.dll相比,UCRT允许静态C++库使用动态C运行时,这样可以显著减小生成的二进制文件体积,提升软件的分发便利性。
CMake配置注意事项
在使用CMake配置项目时,启用UCRT需要特别注意链接选项的设置。通过add_link_options和link_libraries指令,可以灵活选择动态或静态库,确保项目能够正确链接到所需的运行时库。
LLVM与UCRT的兼容性
使用LLVM MinGW的clang编译器时,可以实现release版本连接到ucrtbase.dll。这种兼容性使得开发者在选择编译工具时有了更多的灵活性,同时避免了传统API兼容性问题。
延伸问答
UCRT是什么,它解决了什么问题?
UCRT是微软重写的C运行时,解决了exe文件依赖特定版本msvcrXXX.dll的问题,允许静态C++库动态链接C运行时,从而减小二进制体积。
如何在CMake中启用UCRT?
在CMake中启用UCRT的方式是通过add_link_options和link_libraries指令来配置。
VS2022默认使用什么运行时?
VS2022默认使用UCRT作为运行时。
UCRT与旧版msvcrt.dll的主要区别是什么?
UCRT允许静态C++库使用动态C运行时,而旧版msvcrt.dll要求静态C++库使用静态C库。
使用llvm-mingw的clang编译器有什么优势?
使用llvm-mingw的clang编译器可以实现release版本连接到ucrtbase.dll,避免了api-ms-*.dll的依赖。
UCRT如何影响二进制文件的体积?
UCRT允许静态C++库动态链接C运行时,从而减小二进制文件的体积,通常可以减少几百KB。