這是網(wǎng)上看到的,放到這里記錄下,供以后參考
1. 普通Exe 文件
完全可以使用下面方法:
A. link標(biāo)記: /nodefaultlib
代表: Ignore all default libraries
包括運(yùn)行時(shí)庫, 都不用.
當(dāng)然如果大家要用相關(guān)c運(yùn)行時(shí)庫的api 怎么辦呢?
可以使用相關(guān)對應(yīng)的API, 比如strcmpi, 使用lstrcmpi, 詳細(xì)請參考下表:
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. 設(shè)置連接節(jié)大小及其他
加入下面代碼到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大小為一節(jié)
// 合并段
#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 字節(jié)以內(nèi).
我曾寫過一個(gè)程序使用了文件讀寫, 執(zhí)行進(jìn)程, 字符運(yùn)算, 等等一共50多行代碼, 最終大小為: 1488字節(jié).
C. 不幸的是可能還是要使用c運(yùn)行庫
那可以使用這個(gè) LIBCTINY.LIB文件, 以盡量減小. 當(dāng)然這個(gè)lib 本身包括不多的運(yùn)行庫api.
LIBCTINY.LIB 文件以及源程序參考:
http://msdn.microsoft.com/msdnmag/issues/01/01/hood/default.aspx
2. 普通Dll 大小問題
因?yàn)? __DllMainCRTStartup 或: _DllMainCRTStartup 要調(diào)用運(yùn)行時(shí)庫
還好, LIBCTINY.LIB 里面已經(jīng)有相關(guān)實(shí)現(xiàn), 可以用LIBCTINY.LIB, 而不用調(diào)用運(yùn)行庫了. 這樣可以大大減小.
連接設(shè)置:
#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
另外我的測試程序中導(dǎo)出了一個(gè)接口
BOOL _stdcall ExpHook( )
{
return 0;
}
最終大小為: 992字節(jié).
3. 復(fù)雜Dll 和復(fù)雜Exe 大小問題
如果你的程序一定要使用MFC, 那怎么編繹至少也有幾十KB了.
但你還是可以用相關(guān)PE壓縮程序壓縮一下的. 至少能壓縮到50%.
如果是COM, 建議不要使用MFC, 如果使用ATL, 可以使用壓縮程序壓縮一下, 基本會(huì)在20-40K 大小.
復(fù)雜類型的Dll, Exe 肯定是要使用運(yùn)行庫的. 像用了ATL就沒有辦法不用運(yùn)行庫了.