大家都是VC6 研究的多,但是VC8中有些变化。我配了图文给大家说明:
我们任意新建一个WIN32程序:
自动生成的代码 ,我们用Release模式编译:
但是注意了,如果我们把这个程序拷贝到其它机器是肯定无法运行的,原因是没有VC的运行时8.0的库。要让我们的程序可以共享,我们必须静态连接:
编译以后会发现应用程序:
这当然让我们不能够容忍,一个纯WIN32应用程序,居然这么大。。。还没有用MFC呢?
怎么办呢:让我们一步一步地来,首先摆脱掉运行库。
1.取消对运行库的依赖:
改为是
编译一下:
会出现编译错误:
1>------ 已启动生成: 项目: MyEmpytWin32, 配置: Release Win32 ------
1>正在链接...
1>LINK : error LNK2001: 无法解析的外部符号__tmain
1>MyEmpytWin32.obj : error LNK2001: 无法解析的外部符号@__security_check_cookie@4
1>C:\Documents and Settings\Administrator\My Documents\Visual Studio 2005\Projects\MyEmpytWin32\Release\MyEmpytWin32.exe
: fatal error LNK1120: 2 个无法解析的外部命令
1>生成时间0:00
继续编译会出现编译器错误:
1>正在链接...
1>LINK : error LNK2001: 无法解析的外部符号_mainCRTStartup
1>
C:\Documents and Settings\Administrator\My Documents\Visual
Studio 2005\Projects\MyEmpytWin32\Release\MyEmpytWin32.exe : fatal error LNK1120:
1 个无法解析的外部命令
设置入口点首先我们改一下代码,把默认的 Vc Runtime Main函数改动一下:
像这样子:
#include "stdafx.h"
int main()
{
return 0;
}
并设置入口点:
编译成功以后:
会发现程序小了好多。但是超小的话我们还得做一些处理:
1.合并区段
察看区段
添加下面的命令行(!VC8不允许将资源区段合并到任何区段!)
1>已完成代码的生成
1>LINK : warning LNK4254: 节“.data”(C0000040)合并到具有不同属性的“.text”(60000020)
1>
正在嵌入清单...
出现警告,我们不必理会!
已经比较小了,不过用OD打开看1000字节对齐还浪费了不少字节!
打开MSDN找到对齐的相关帮助:
/ALIGN[:number]
其中:
我们这里设置为1024(小于将无法被windows加载器加载,,)
!下面我们来打造小于512字节的超小应用程序!
去除调试信息:
去除清单文件
现在在编译器一下:
怎么样?满意了吧。我们为了让我这个程序有点实际意义:
去掉默认的Unicode支持 毕竟Unicode是16
bits一个字符,不合算:)
#include "stdafx.h"
#include <windows.h>
int main()
{
MessageBox(NULL,"Hello World~\n This is a smallest app","你好",MB_ICONINFORMATION);
return 0;
}
代码像这样
大小和运行时截图唯一的遗憾就是.text节里面还剩余字节但是却超过了512字节:(。。
下一篇文章我将介绍更有实用价值的,毕竟VC的运行库在很多地方还是很方便的,而且如果不使用 Runtime就无法进行浮点运算。。这在写注册机之类的操作当然不允许的。