VC 写的程序体积是挺大的,网上也有很多优化的文章,都是针对 VC6.0 来说的。 我把我的总结下。 #include
#pragma comment(lib,"kernel32.lib") #pragma comment(lib,"user32.lib") 写 Win32 程序的话,windows.h 是必须的,使用动态连接必要的系统库,可以把 link 下的链接库全部删除,需要就练级。
#pragma comment(lib,"msvcrt.lib") 这句是用来动态连接 VC 库的,使用 VC6.0 的可以加上,但是使用 VS2008 以后的 就不要加了。我是用 VS2010 的时候,编译后需要 msvcr100.dll 文件。VS2010 一旦静态链接了 msvcrt.lib,体积立马上到 28,如果复杂点的程序可能会更大。 如个仅仅是一个 HelloWorld,一个 MessageBox 的话,因为不需要用到 msvcrt.lib,所以体积不会增加的,这个时候加不加这句话都无所谓。 #pragma comment(linker, "/SUBSYSTEM:windows") 这句是用来说明是 win32 程序, 不是控制台的程序, 控制台的程序会有个黑窗口。 可以再程序里写,也可以再配置里写。 #pragma comment(linker, "/ENTRY:main") 这个用来更改入口函数,对 vs2010 编译的程序,效果很明显。一旦指定了入口 函数,体积真的是立马下来了。 #pragma comment (linker, "/ALIGN:512") 对齐方式,这个我用 VS2010 测试的时候,修改这个,编译后的程序都提示不是 有效的 Win32 程序。VC6.0 上没问题。VS2010 编译的同志就不要改了。VC6.0 的 可以修改测试,数值还可以减少。 #pragma comment(linker, "/merge:.data=.text") #pragma comment(linker, "/merge:.rdata=.text") 合并区段。我认为是没什么必要,编译的时候会有警告。VS2010 编译后可能会 出现程序不能正常运行,VC6.0 的正常,不推荐。 #pragma comment(linker, "/OPT:NOWIN98")
不对 Windows 98 系统做优化。VS2010 已经取消了这个选项,如果加上这句话, 编译的时候会出现警告。VC6.0 加着句话,也能减少不少的体积。VC6.0 上,推 荐使用。 OPtimization Minimize Size(/O1)
C/C++选项里的,最小体积编译,效果不明显。
最后看下效果:
Code Snippet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. } int main() { MessageBox(NULL, TEXT("hello!"), TEXT("hi"), 0) ; return 0 ; #include #pragma comment(lib,"kernel32.lib") #pragma comment(lib,"user32.lib") #pragma comment(linker, "/SUBSYSTEM:windows") #pragma comment(linker, "/ENTRY:main")
这段代码使用 VS2010 编译后体积也只有 3K。其他一些优化,对体积的影响不明 显,基本可以忽略不计。不过大家有兴趣的话,可以自己测试。如果找到其他优 化的方法也记得和我说下。