這是網上看到的,放到這里記錄下,供以后參考
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, 而不用調用運行庫了. 這樣可以大大減小.
連接設置:
#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就沒有辦法不用運行庫了.