減小Exe, DLL 的大小問題 – VC

來源:互聯網
上載者:User

原帖:http://blog.csdn.net/davemin/archive/2006/09/26/1289795.aspx

 

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就沒有辦法不用運行庫了.

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.