龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > VC开发 >

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

时间:2009-12-30 15:42来源:未知 作者:admin 点击:
分享到:
1. 普通Exe 文件 完全可以使用下面方法: A. link标记: /nodefaultlib 代表: Ignore all default libraries 包括运行时库, 都不用. 当然如果大家要用相关c运行时库的api 怎么办呢? 可以使用相关对应的

1. 普通Exe 文件

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

包括运行时库, 都不用.

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

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

2. 普通Dll 大小问题

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

精彩图集

赞助商链接