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, 而不用調用運行庫了. 這樣可以大大減小.