减小Exe, DLL 的大小问题 - VC

    技术2022-05-12  41

    原帖: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 functionWin32 equivalentmallocHeapAllocfreeHeapFreestrcpylstrcpystrcatlstrcatstrncpylstrncpystrncatlstrncatstrlenlstrlenstrcmplstrcmpstrcmpilstrcmpimemcpyCopyMemorymemsetFillMemory or ZeroMemorymemmoveMoveMemorytoupperCharUppertolowerCharLowerisalphaIsCharAlphaisalnumIsCharAlphaNumericislowerIsCharLowerisupperIsCharUppersprintfwsprintfvsprintfwvsprint

    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就没有办法不用运行库了.


    最新回复(0)