如何減少exe,dll大小
完全可以使用下面方法:
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位元組.
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就沒有辦法不用執行庫了.
more:感覺另外還有應該儘量少用全域性和靜態變數,他們會被直接編譯到PE檔案的資料(.data, .rdata)段中;另外圖片等資源也挺耗空間,簡單的圖片可以在執行時自己畫出來。