减小Exe, DLL 的大小问题 - VC

宽城板栗

宽城板栗

2016-02-19 18:40

下面这个减小Exe, DLL 的大小问题 - VC教程由图老师小编精心推荐选出,过程简单易学超容易上手,喜欢就要赶紧get起来哦!

1. 普通Exe 文件

完全可以使用下面方法:
A. link标记: /nodefaultlib
代表: Ignore all default libraries

包括运行时库, 都不用.

当然如果大家要用相关c运行时库的api 怎么办呢?
可以使用相关对应的API, 比如strcmpi, 使用lstrcmpi, 详细请参考下表:

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)

Standard function Win32 equivalent
malloc HeapAlloc
free HeapFree
strcpy lstrcpy
strcat lstrcat
strncpy lstrncpy
strncat lstrncat
strlen lstrlen
strcmp lstrcmp
strcmpi lstrcmpi
memcpy CopyMemory
memset FillMemory or ZeroMemory
memmove MoveMemory
toupper CharUpper
tolower CharLower
isalpha IsCharAlpha
isalnum IsCharAlphaNumeric
islower IsCharLower
isupper IsCharUpper
sprintf wsprintf
vsprintf wvsprint


B. 设置连接节大小及其他
加入下面代码到cpp文件就可以.

#ifndef _DEBUG  
 #pragma comment(linker, "/FILEALIGN:16") 
 #pragma comment(linker, "/ALIGN:16")  

 #pragma comment(linker, "/OPT:REF")
 #pragma comment(linker, "/OPT:ICF")
 #pragma comment(linker, "/OPT:NOWIN98")  // 使用老VC编绎器的512大小为一节

 // 合并段
 #pragma comment(linker, "/MERGE:.rdata=.data")
 #pragma comment(linker, "/MERGE:.text=.data")
 #pragma comment(linker, "/MERGE:.reloc=.data")

 // Favour small code
 #pragma comment(linker, "/ENTRY:WinMain")
#endif

如果是少量代码的Exe 程序, 最终大小可以在1500 字节以内.
我曾写过一个程序使用了文件读写, 执行进程, 字符运算, 等等一共50多行代码, 最终大小为: 1488字节.

C. 不幸的是可能还是要使用c运行库
那可以使用这个 LIBCTINY.LIB文件, 以尽量减小. 当然这个lib 本身包括不多的运行库api.
LIBCTINY.LIB 文件以及源程序参考:
http://msdn.microsoft.com/msdnmag/issues/01/01/hood/default.aspx

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)

2. 普通Dll 大小问题

因为: __DllMainCRTStartup 或: _DllMainCRTStartup 要调用运行时库
还好, LIBCTINY.LIB 里面已经有相关实现, 可以用LIBCTINY.LIB, 而不用调用运行库了. 这样可以大大减小.

连接设置:

#ifndef _DEBUG

 // default lib setting.
 #pragma comment(linker, "/defaultlib:kernel32.lib")
 #pragma comment(linker, "/defaultlib:LIBCTINY.LIB")
 #pragma comment(linker, "/nodefaultlib:libc.lib")
 #pragma comment(linker, "/nodefaultlib:libcmt.lib")

 // section size
 #pragma comment(linker, "/FILEALIGN:16")
 #pragma comment(linker, "/ALIGN:16")
 #pragma comment(linker, "/OPT:NOWIN98")

 // 合并段
 #pragma comment(linker, "/MERGE:.rdata=.data")
 #pragma comment(linker, "/MERGE:.text=.data")
 #pragma comment(linker, "/MERGE:.reloc=.data")

#endif

另外我的测试程序中导出了一个接口
BOOL _stdcall ExpHook( )
{
 return 0;
}

最终大小为: 992字节.

3. 复杂Dll 和复杂Exe 大小问题

如果你的程序一定要使用MFC, 那怎么编绎至少也有几十KB了.
但你还是可以用相关PE压缩程序压缩一下的. 至少能压缩到50%.

如果是COM, 建议不要使用MFC, 如果使用ATL, 可以使用压缩程序压缩一下, 基本会在20-40K 大小.

复杂类型的Dll, Exe 肯定是要使用运行库的. 像用了ATL就没有办法不用运行库了.
----------------------------------------
感谢大家对此关心, 并有相关研究请指教于我

展开更多 50%)
分享

猜你喜欢

减小Exe, DLL 的大小问题 - VC

编程语言 网络编程
减小Exe, DLL 的大小问题 - VC

利用VC从DLL传递消息到EXE

编程语言 网络编程
利用VC从DLL传递消息到EXE

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

减小Word文件的大小方法

word
减小Word文件的大小方法

不能忽视的小问题

电脑网络
不能忽视的小问题

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

有效减小word文件大小的妙招

办公软件
有效减小word文件大小的妙招

宝宝睡眠常见的小问题

宝宝睡眠 睡眠
宝宝睡眠常见的小问题

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

GT630显卡怎么样

GT630显卡怎么样

在页面内加入日期

在页面内加入日期
下拉加载更多内容 ↓