减小VC编译文件体积

通常vc++编译出来的程序体积很大,debug模式的程序的最小体积一般都在100KB以上。这使不少人对VC++有了不好的印象,以为VC++是制造麻烦的工具。其实情况并不是这样,我们可以通过一些办法有效的减少执行程序的体积。

下面通过一个具体的范例给你讲述:

1,首先我们打开vc++建立一个Win32   Application,工程名随便,接下来选择“a   Typical   "hello   World"   application”(因为是范例,所以以hello   world为标准)

2,选择编译方式为Win32   -   Release.   这时候你编译程序,生成的执行程序是28kb(如果你的机器感染了病毒,体积可能会大一些,如果我的机器感染了病毒,而你的机器正常,你的执行程序可能会小一些...这些全都是废话)

3,选择菜单:Project->Settings(或者按Alt+F7),打开Link属性页。将Object/library   modules:下面编辑框中的各种lib全部删除,然后打上MSVCRT.LIB   kernel32.lib   user32.lib

此后编译程序,生成的执行程序为20kb(此时编译程序会出现警告:LINK   :   warning   LNK4098:   default   lib   "LIBC"   conflicts   with   use   of   other   libs;   use   /NODEFAULTLIB:library不必理会,如果你想去掉警告,就在Ignore   all   default   libraries前打勾)

4,接着上面,在Project->Settings的Link属性页里,在Project   Options下面的编辑框里加上一句:/ALIGN:4096   这样做之后指定了程序不是驱动程序

此后编译程序,生成的执行程序为7KB

至此给Win32   Application减肥告一段落,7KB的程序另我满意了,如果你觉得还能减,不妨再做一些别的尝试,等你的好消息:)

减肥总结:选择恰当的编译模式,去掉不必要的库。

 

今天突然想到见过别人用vc写的木马 下载者之类大小都只有 几K (没用过pe压缩程序)

我写个hello world用 release + minimize size 编译都有30++k

于是google寻求解答 搜索了一些相关信息 有效的做个总结如下

 

#include <windows.h>

 

//自定义加载的库

#pragma comment(lib,"kernel32.lib")

#pragma comment(lib,"shell32.lib")

#pragma comment(lib,"msvcrt.lib")

 

//自定义函数入口

#pragma comment(linker, "/ENTRY:EntryPoint")

 

//自定义对齐方式

#pragma comment (linker, "/ALIGN:512")

#pragma comment(linker, "/FILEALIGN:512")

 

// 优化选项

#pragma comment(linker, "/opt:nowin98")

#pragma comment(linker, "/opt:ref")

#pragma comment (linker, "/OPT:ICF")

 

// 合并区段

#pragma comment(linker, "/MERGE:.rdata=.data")

#pragma comment(linker, "/MERGE:.text=.data")

#pragma comment(linker, "/MERGE:.reloc=.data")

 

int  WINAPI  WinMain( HINSTANCE hInstance,

         HINSTANCE hPrevInstance,

         LPSTR lpCmdLine,

         int iCmdShow ) ;

 

void  EntryPoint()

{

   ExitProcess(WinMain(GetModuleHandle(NULL), NULL,

                  GetCommandLine(), SW_SHOWNORMAL));

}  

/

写了下段代码编译后1K

用peid查看不是vc6.0 而是First Publisher Graphics format *

 

#include <windows.h>

 

//自定义加载的库

#pragma comment(lib,"kernel32.lib")

#pragma comment(lib,"shell32.lib")

#pragma comment(lib,"msvcrt.lib")

 

//自定义函数入口

#pragma comment(linker, "/ENTRY:EntryPoint")

 

//自定义对齐方式

#pragma comment (linker, "/ALIGN:512")

#pragma comment(linker, "/FILEALIGN:512")

 

// 优化选项

#pragma comment(linker, "/opt:nowin98")

#pragma comment(linker, "/opt:ref")

#pragma comment (linker, "/OPT:ICF")

 

// 合并区段

#pragma comment(linker, "/MERGE:.rdata=.data")

#pragma comment(linker, "/MERGE:.text=.data")

18#pragma comment(linker, "/MERGE:.reloc=.data")

 

int  WINAPI  WinMain( HINSTANCE hInstance,

                      HINSTANCE hPrevInstance,

                      LPSTR     lpCmdLine,

                      int       iCmdShow ) ;

 

void  EntryPoint()

{

   ExitProcess(WinMain(GetModuleHandle(NULL), NULL,

                      GetCommandLine(), SW_SHOWNORMAL));

}

 

int WINAPI WinMain( HINSTANCE hInstance,

                    HINSTANCE hPrevInstance,

                    LPSTR     lpCmdLine,

                    int       iShowCmd )

{

    MessageBox(NULL, TEXT("hello!"), TEXT("hi"), 0) ;

    return 0 ;

}

 

遇到的一些问题 就是编译可以通过但有2个警告还需要解决下

对pe的结构还不是很了解 用uedit32看了下 还有很多00 不知道是不是还有压缩的空间

实现同样功能用masm32写的会小很多

这些选项也没有研究的很透 肯定还存在问题 这里先留个帖子  以后改进了弄明白了再来修改

 
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值