减小Exe, DLL 的大小问题 - VC
2009-05-26 11:15
387 查看
原帖: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, 详细请参考下表:
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. 普通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 |
加入下面代码到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就没有办法不用运行库了.
相关文章推荐
- 减小Exe, DLL 的大小问题 - VC
- 减小Exe, DLL 的大小问题 - VC
- 减小Exe, DLL 的大小问题 - VC
- VC生成的DLL给QT的EXE调用时lib路径问题小结
- 关于VC调用dll,exe时引用目录路径问题
- 如何减小Exe, DLL 的大小
- VC生成的DLL给QT的EXE调用时lib路径问题小结
- DLL与EXE之间的内存 new 与 delete 上的问题
- VC6LineNumberAddin.dll 在win7x64下的注册问题
- VB调用VC++的DLL问题:原因可能是托管的PInvoke 签名与非托管的目标签名不匹配。请检查PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配。
- VC++ 坐标问题总结,控件大小随窗口变化
- (原创)VB调用DLL(VC)使用结构体参数时的内存对齐及分配的问题.
- 在VC下把exe文件转换成DLL文件
- VC调用Delphi的DLL时遇到的问题及解决
- 在vc中的regular dll中使用ado的导入问题
- 无法启动此程序,因为计算机中丢失VCRUNTIME140.dll 尝试重新安装此程序以解决此问题
- 批处理发布web项目及应用程序,cs,vc编译的DLL,exe
- 问一个调用VC下编写的dll的问题???好怪哦
- MinGW编译的EXE需要DLL的问题
- delphi调用vc编写的DLL应注意的问题