对于极致要求体积的程序来说。抛弃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库的更多相关文章

  1. DirectX11--HR宏关于dxerr库的替代方案

    DirectX11 With Windows SDK完整目录 欢迎加入QQ群: 727623616 可以一起探讨DX11,以及有什么问题也可以在这里汇报. 综述 参考文章:https://blogs. ...

  2. Golang : pflag 包简介

    笔者在前文中介绍了 Golang 标准库中 flag 包的用法,事实上有一个第三方的命令行参数解析包 pflag 比 flag 包使用的更为广泛.pflag 包的设计目的就是替代标准库中的 flag ...

  3. 菜鸟Python学习笔记第一天:关于一些函数库的使用

    2017年1月3日 星期二 大一学习一门新的计算机语言真的很难,有时候连函数拼写出错查错都能查半天,没办法,谁让我英语太渣. 关于计算机语言的学习我想还是从C语言学习开始为好,Python有很多语言的 ...

  4. 抛弃jQuery:DOM API之选择元素

    原文链接:http://blog.garstasio.com/you-dont-need-jquery/selectors/ 我的Blog:http://cabbit.me/you-dont-need ...

  5. Linux posix线程库总结

    由于历史原因,2.5.x以前的linux对pthreads没有提供内核级的支持,所以在linux上的pthreads实现只能采用n:1的方式,也称为库实现. 线程的实现,经历了如下发展阶段: Linu ...

  6. scikit-learn 线性回归算法库小结

    scikit-learn对于线性回归提供了比较多的类库,这些类库都可以用来做线性回归分析,本文就对这些类库的使用做一个总结,重点讲述这些线性回归算法库的不同和各自的使用场景. 线性回归的目的是要得到输 ...

  7. Generator库co4.6使用及源码分析

    原文链接 http://www.cnblogs.com/ytu2010dt/p/6043947.html co4.x已经抛弃了原来thunk转而结合promise实现. 一:promise proms ...

  8. HAL驱动库学习-ADC

    如何使用ADC驱动库 1  实现如下两个函数     a: HAL_ADC_MspInit()使能ADC时钟,设置时钟源, 使能ADC Pin,设置为输入模式,可选 DMA,中断     b:HAL_ ...

  9. VS中Debug和Realease、及静态库和动态库的区别整理(转)

    原文出自:http://www.cnblogs.com/chensu/p/5632486.html 一.Debug和Realease区别产生的原因 Debug 通常称为调试版本,它包含调试信息,并且不 ...

随机推荐

  1. 安装和配置SVN服务器Subversion、客户端TortoiseSVN和Visual Studio插件AnkhSvn

    1.下载并安装服务器端Subversion下载地址:http://subversion.apache.org当前最新版本为1.8.10,默认安装目录为C:\Program Files\Subversi ...

  2. Myeclipse出现 java文件中文乱码问题

    一.将整个project设置编码UTF-8(UTF-8可以最大的支持国际化) windows->Preferences->general->Workspace->Text fi ...

  3. 把 Mac 上的 bash 换成 zsh

      本人补充:mac版git下载地址:http://code.google.com/p/git-osx-installer/downloads/list?can=3&q=&sort=- ...

  4. Nodejs的安装及配置

    1.从Nodejs官网下载安装包,进行安装,是否安装成功,可以从cmd npm去检查,出现如下界面,就表示安装成功 2.打开Webstorm进行配置,(如果安装前打开webstorm了,需要重启web ...

  5. pandas应用之分组因子暴露和分位数分析

    pandas应用之分组因子暴露和分位数分析 首先感谢原书作者Mes McKinney和batteryhp网友的博文, 俺在此基础上继续探索python的神奇功能. 用A股的实际数据, 以书里的代码为蓝 ...

  6. 转:深入浅出UML类图(具体到代码层次)

    深入浅出UML类图 作者:刘伟 ,发布于:2012-11-23,来源:CSDN   在UML 2.0的13种图形中,类图是使用频率最高的UML图之一.Martin Fowler在其著作<UML ...

  7. apache2.4以上版本配置虚拟主机

    一  将 主配置文件 httpd.conf中 #Include conf/extra/httpd-vhosts.conf 前面的# 去掉 二  进入conf/extra 修改 /conf/extra/ ...

  8. VB关闭其他进程的输入法

    http://files.cnblogs.com/files/liuzhaoyzz/%E5%85%B3%E9%97%AD%E5%85%B6%E4%BB%96%E8%BF%9B%E7%A8%8B%E8% ...

  9. Java开源BI系统介绍(转)

    http://blog.csdn.net/boboo_2000_0/article/details/4810420 BI解决方案中的工具 一个完整的BI解决方案中有多种工具来完成BI系统中各个阶段的工 ...

  10. 【LeetCode】#344 Reverse String

    [Question] Write a function that takes a string as input and returns the string reversed. Example: G ...