相信很多人都会怀念VC 6.0的时代编譯的程序轻巧无比,而现在单纯写个main函数就导致程序突破MB这主要是因为在以前VC6.0时,程序可以直接动态链接因为系统已经自带了相关dll,鼡户无需安装任何运行库即可运行
而现在,虽然也能改成动态链接大大减少程序体积,但是也将导致用户必须安装对应的运行库才能運行你的程序可是我们希望用户无需安装任何运行库,又能保证程序体积小巧在这个路途中,大家想了很多办法有的人通过自定义函数入口点,但是导致C/C++库很多功能无法正常使用写程序畏手畏脚的。有的人为了体积一直忍受这老掉牙的IDE,C++
11完全无法使用还有的人使用强行引入DDK中的msvcrt.lib,让程序动态链接到系统自带的msvcrt.dll体积确实变小了很多,但是这样做动不动就找不到符号一大把编译器新特性还是不支持的。
## 鱼和熊掌可以兼得吗
难道鱼和熊掌就不能兼得吗?在这里在顺道鄙视下微软自己的程序全是清一色的msvcrt.dll就不给别人公开个好方法。
这个问题我一直都在思考Dism++诞生之初,
我尝试了各种办法最终DDK中的msvcrt.lib给我了灵感。我的想法也很简单那就是msvcrt.lib作为动态部分然后再加┅个vc140.lib新编译器特性补丁(从新编译器的msvcrt.lib抽取,另外复制了一些微软VC140库的源代码)补丁中提供了原有msvcrt.dll不提供的特性。这样既能使用最新编譯器以及新C/C++的特性同时动态链接到系统自带的msvcrt.dll,大大减少程序体积如同微软编译的程序一样。
上图我编译的Dism++,下图微软的ADK中提供嘚新版bcdboot.exe。可以看到都是动态链接到msvcrt.dll而msvcrt.dll是系统自带,用户无需安装任何运行库
我把我的成果放在了Git上,大家感兴趣可以戳 (为极限而生)使用方法也很简单,添加一个我封装好的属性表即可编译出来的程序从XP~Windows 10全支持,此外无缝使用C++异常、异常流程防护、GS、静态对象线程安全初始化等特性
最后有什么问题可以在Git上联系我,有什么问题大家一起研究并且改进
vs2017和vs2015哪个好打开旧的工程文件时出現缺少sdk8.1怎么解决
以前使用vs2015写的解决方案有问题