sonyps5201314 / msvcr14x

msvcr14x is a program that allows programs compiled with VC2015 and above not to rely on a bunch of useless API-Ms-win-starting DLLS
Apache License 2.0
54 stars 14 forks source link

项目目标:我对该项目的目标有一些疑惑 #8

Closed Demonese closed 1 year ago

Demonese commented 1 year ago

该项目和VC-LTL相比有什么优势?和/MT或/MTd选项相比(静态链接到CRT)又有什么独特的优势?这些方式都能避免链接到共享CRT库。

sonyps5201314 commented 1 year ago

该项目和VC-LTL相比有什么优势? 1.【合法性】VC-LTL存在更多的法律风险,VC-LTL大量使用了微软很多不开源的代码并对其修改且再次分发出来,这些代码版权归微软,第三方并不具有修改权和再次分发权。 2.【体积】VC-LTL仓库及nuget包都很巨大,5.0之前的版本尤为甚之。编译出来的可执行文件体积也比它的及微软原始动态链接的更小。 3.【稳定性】VC-LTL这些修改的代码因为是出自自己团队成员之手,所以代码质量和可靠性稳定性肯定都不及微软的官方实现,所以你会看到他们经常修改提交代码来修复问题,如果用户遇到问题,其仓库成员也暂时没空,只有自己修改解决,这考验了使用者自己的编程能力,且增加了风险。而本项目是通过提供vs工程文件来完全原汁原味编译微软官方的代码,所以更安全可靠。

和/MT或/MTd选项相比(静态链接到CRT)又有什么独特的优势?这些方式都能避免链接到共享CRT库。 1.除了上面说的第二条,动态链接能复用CRT的代码,对于包含多个组件的相对大型的工程来说,节省了大量的文件体积占用。 2.本项目不是避免链接到共享CRT库,是自己编译UCRT,STL,MFC等微软动态链接库。区别是本项目编译出来的动态链接库导入表中不会依赖api-ms-win-xxx.dll那一百多个文件,因此使用本项目后你最终发布软件时,就不需要带api-ms-win-xxx.dll那一百多个文件了,也是对体积和发布的优化,就和VS2010-VS2013开发的程序一样。

Demonese commented 1 year ago

本项目不是避免链接到共享CRT库,是自己编译UCRT,STL,MFC等微软动态链接库。

看到这个就理解了,其实就是在官方VCRT和UCRT的基础上定制化编译。 感谢作者的工作,希望能将该方案的优势更详细地记载在readme里。

sonyps5201314 commented 1 year ago

不知道你上面说的VCRT是什么意思,msvcrt.dll还是STL,如果你指的是前者,那就不是那个意思,本项目中的msvcr14x组件并不兼容msvcrt.dll,仅兼容ucrt即ucrtbase(d).dll。除了这个,其他每个dll都是和VS2015及以上版本的CRT可再分发组件(如C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Redist\MSVC\14.36.32532\x86)二进制兼容的,你甚至可以在不重新编译之前的文件,直接通过 https://github.com/sonyps5201314/RemoveApiSets.git 将依赖的crt,c++ stl,mfc等dll替换过来。

Demonese commented 1 year ago

不知道你上面说的VCRT是什么意思,msvcrt.dll还是STL

从VS2015开始,微软将CRT分为了VCRT和UCRT两部分,VCRT负责不稳定的应用程序初始化、异常处理、C++标准库实现等,UCRT则负责ABI稳定的C/C++标准库和微软拓展API,并从Windows 10开始作为系统组件存在(Windows Vista/7/8.x也有对应的UCRT补丁可以安装)。

我关注的是VS2015之后的VCRT,遗留的msvcrt已经不再考虑了。

你甚至可以在不重新编译之前的文件,直接通过 https://github.com/sonyps5201314/RemoveApiSets.git 将依赖的crt,c++ stl,mfc等dll替换过来。

感谢作者,这个工具相当强大。