程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> vc教程 >> 減小Exe, DLL 的大小問題

減小Exe, DLL 的大小問題

編輯:vc教程

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就沒有辦法不用運行庫了.
----------------------------------------
感謝大家對此關心, 並有相關研究請指教於我

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved