抛弃msvcrtXX库
对于极致要求体积的程序来说。抛弃Msvcrt里的函数是必要的。(尤其是msvcrtXX库)因为要使用mscvrt中的函数,就需要带上相对来 说,不能容忍的几kb的,vcrt初始化函数,包围在我们的WinMain之外,而且对于高版本的msvcrtXX库,在开发某些程序的时候是不能臆想客 户机上就一定安装了对应的run time库了,要静态链接,又不知道大到哪里去了。抛弃mscvrt只是为了编译出来的程序体积小,可以说是针对特殊情况下的,不得已而为之,在不用考虑 体积的情况下,最好不要走这种极端。
抛弃Msvcrt说实话根本没有难度,只是很麻烦。
1.抛弃/GS
/GS是vc运行时库提供的。
如果没有设置,不启用/GS。可能会得到以下链接错误。
error LNK2001: 无法解析的外部符号 @__security_check_cookie@4
2.抛弃C运行时库的new、delete与malloc、free
替代的办法是用WinApi实现自己的版本(c运行时库其实就是对Heap系列的封装),或者直接使用WinApi Heap系列或者Virtual系列分配内存。
3.用ntdll中的RtlXXXMemory函数,替代C运行库提供的宏以及memXXX。
ntdll中导出了RtlMoveMemory、RtlCompareMemory、RtlFillMemory、RtlZeroMemory。完全足够使用。
我 现在的招数还是。。动态调用。。用GetModuleHandle和GetProcAddress,不过听说也能静态,我问了一下大神,大神说那种得用 wdk里提供的ntdll.lib,他不太放心。如果能有不链接这个lib就能静态调用的办法,那就太好了。我还没发现。
4.strXXXX系列wcsXXXX系列
有lstrXXXW/A系列替代或者StrStrX StrChrX等shlwapi。
还有StringCchXXXX和StringCbXXXX。
但是StringCchXXXX和StringCbXXXX属于提供源码的库(函数会被编译加入到我们的程序中),而不是动态链接的,使用这种库体积会比动态链接大一点。
Ps: 如果你完全不需要msvcrt库支持之后,一些什么平时很注意的。。用_beginthreadex代替CreateThread。。这种由于使用 msvcrt库才存在的编程准则。。不再有效。无须纠结。而且去除mscvrt本身就需要。不能调用_beginthreadex这种有msvcrt提供 的函数。
5.设置项目属性的链接器的输入选项。
忽略所有默认库。
将自己用到的库添加进去。
比如kernel32.lib user32.lib shlwapi.lib。
编译一下啊。看看还有什么需要调整的。
一般会看见
error LNK2001: 无法解析的外部符号XXXX
必然是这个函数属于msvcrt那套。需要替换成等价的API
或者你需要的库。你没有添加全。根据msdn里面写着的。调用某个函数需要的库lib添加上lib.
6.改入口点
我比较喜欢用预处理命令。
#pragma comment(linker, "/entry:wWinMain")
项目属性里也有设置。
7.说了这么多。。会有很多人说。。你麻烦不麻烦。你改这么多东西。。为什么不用汇编。。
首先。。我闲汇编麻烦。
其次。。用汇编一定小么?
再次。。你当编译器的性能优化是渣渣?
当然。绝对是有人能写出比编译器优化过的代码还好的汇编代码的,这点我相信。但是我觉得。这个人不是我,也大概不是还会把我这蛋疼文章看到末尾的你。
抛弃msvcrtXX库的更多相关文章
- DirectX11--HR宏关于dxerr库的替代方案
DirectX11 With Windows SDK完整目录 欢迎加入QQ群: 727623616 可以一起探讨DX11,以及有什么问题也可以在这里汇报. 综述 参考文章:https://blogs. ...
- Golang : pflag 包简介
笔者在前文中介绍了 Golang 标准库中 flag 包的用法,事实上有一个第三方的命令行参数解析包 pflag 比 flag 包使用的更为广泛.pflag 包的设计目的就是替代标准库中的 flag ...
- 菜鸟Python学习笔记第一天:关于一些函数库的使用
2017年1月3日 星期二 大一学习一门新的计算机语言真的很难,有时候连函数拼写出错查错都能查半天,没办法,谁让我英语太渣. 关于计算机语言的学习我想还是从C语言学习开始为好,Python有很多语言的 ...
- 抛弃jQuery:DOM API之选择元素
原文链接:http://blog.garstasio.com/you-dont-need-jquery/selectors/ 我的Blog:http://cabbit.me/you-dont-need ...
- Linux posix线程库总结
由于历史原因,2.5.x以前的linux对pthreads没有提供内核级的支持,所以在linux上的pthreads实现只能采用n:1的方式,也称为库实现. 线程的实现,经历了如下发展阶段: Linu ...
- scikit-learn 线性回归算法库小结
scikit-learn对于线性回归提供了比较多的类库,这些类库都可以用来做线性回归分析,本文就对这些类库的使用做一个总结,重点讲述这些线性回归算法库的不同和各自的使用场景. 线性回归的目的是要得到输 ...
- Generator库co4.6使用及源码分析
原文链接 http://www.cnblogs.com/ytu2010dt/p/6043947.html co4.x已经抛弃了原来thunk转而结合promise实现. 一:promise proms ...
- HAL驱动库学习-ADC
如何使用ADC驱动库 1 实现如下两个函数 a: HAL_ADC_MspInit()使能ADC时钟,设置时钟源, 使能ADC Pin,设置为输入模式,可选 DMA,中断 b:HAL_ ...
- VS中Debug和Realease、及静态库和动态库的区别整理(转)
原文出自:http://www.cnblogs.com/chensu/p/5632486.html 一.Debug和Realease区别产生的原因 Debug 通常称为调试版本,它包含调试信息,并且不 ...
随机推荐
- getRuntime
private static void test() { try { Process process = Runtime.getRuntime().exec("cmd"); Dat ...
- javascript创建文档碎片节点
在<javascript高级程序设计>一书的6.3.5:创建和操作节点一节中,介绍了几种动态创建html节点的方法,其中有以下几种常见方法: · crateAttribute(name): ...
- 网页qq客服代码并自定义图片
<script>var online= new Array();</script> <script src="http://webpresence.qq.com ...
- ROS学习笔记(二)——ubantu 14.04 安装
0.采用双系统安装(U盘安装) 1.安装文件在ubantu官网下载: ubantu官网 :https://www.ubuntu.com/ ubuntu的server版和desktop版有什么区? (来 ...
- CentOS 配置防火墙操作实例(启、停、开、闭端口):
CentOS 配置防火墙操作实例(启.停.开.闭端口): 注:防火墙的基本操作命令: 查询防火墙状态: [root@localhost ~]# service iptables status< ...
- j.APR连接器整体框图(含SSL实现分析)
APR连接器的思路和bio,nio的整体架构也是类似的,可以看到下面的整体框图: 第一个区别是,对于从Acceptor线程中的socket解析这块,无论是nio还是bio都是在Acceptor线程内直 ...
- R语言实战(二)数据管理
本文对应<R语言实战>第4章:基本数据管理:第5章:高级数据管理 创建新变量 #建议采用transform()函数 mydata <- transform(mydata, sumx ...
- express+gulp构建项目(二)启动项目和主文件
这一次整理的内容是项目主文件和如何启动项目. 启动项目 通过nodejs官网的例子https://nodejs.org/docs/latest-v4.x/doc/api/synopsis.html我们 ...
- Hprose question
1 在服务端 接口的开发中 如果定义了index()方法 中间不能够有参数,否则报错. 2 接口方法中的参数 最好使用单参数 如fun($uid ) 或者 如果需要多个参数 fun($param){$ ...
- Win7/Win8/Win8.1/Win10下的DragEnter DragDrop事件不触发
Win7/Win8/Win8.1/Win10下的DragDrop事件不触发 2011-02-02 来自:博客园 字体大小:[大 中 小] 摘要:你的应用程序需要从windows资源管理器拖动文件到 ...