|
poor
初级用户
积分 160
发帖 36
注册 2006-12-23
状态 离线
|
『楼 主』:
[编译问题]怎么djgpp编译出的程序那么大啊?
[这回发在这里才对^_^]
我只不过写了个最最简单的hello程序,结果编译出来却有70老多K,近80K的样子,
而原来:
用TC2的才有8K(真tiny);
用LCCwin32编的win32 console程序才9k(很small);
用VC6编的console和gui程序,都是40k(大点也还凑合);
是我设的不对吗?即使再没优化,也不能那么大压。。。。
俺滴老天爷啊,俺么法活辣,这怎么瘦得撩蛙,
谁来帮俺解释解释压。。。。
一个hello的dos程序竟然80K,不敢相信哪。。。:(
|
|
2006-12-24 11:33 |
|
|
electronixtar
铂金会员
积分 7493
发帖 2672
注册 2005-9-2
状态 离线
|
『第
2 楼』:
给你个提示:
Quote: | 瘦身你的执行文件
转载
====
在网上,有好多绿色软件,不仅功能强大,而且软件本身的体积非常小。有的通常只在几十K左右。那他们是怎么做到把软件做的怎么小的呢?现在我手把手的告诉你如何通过修改程序的编译选项来瘦身你的执行文件。
先看一个最典型的程序:
#include <stdio.h>
int main()
{
printf("Hello, World!\n");
return 0;
}
上面的程序之所以被称之为典型,是因为他有如下的内容:
1、系统函数调用:printf
2、有静态数据段
好,现在把此文件放到VisualStudio6.0中进行编译,看看文件有多大。
1、用VisualStudio6.0打开HelloWorld.cpp文件,直接按F7。然后点击OK,生成Project文件,然后进行编译。编译完成了以后,看看Debug目录下的执行文件的大小,为172,096Bytes。
2、刚才编译的Debug文件,现在修改成Release文件看看。选择Win32 Release,再编译。察看执行文件大小,现在成了40,960Bytes。看来Release版本的要比Debug的小。
3、检查代码优化:发现执行文件的优化是Maximize Speed。那么修改成MinimizeSize看看。重新编译,得到执行文件的大小为:40,960Bytes。看来大小没什么变化。其实这是由于我们的代码本身太小的缘故,导致即使变化了也看不出来。
4、想想我们程序的main函数是由CRT类库进行引导的。在我们现在的设定当中,由于采取的是系统缺省的编译连接方式(缺省为编译为Single Thread,StaticLibrary),所以,在我们的执行文件当中,包含了CRT的二进制代码。好,修改编译选项:C/C++ => Category:Code Generation => Use run-time
library:MutiThreaded Dll。编译看看:执行文件大小变成了16,384Bytes。
5、刚才的设定确实不错,一下子把执行文件大小减小到了16K。现在用UltraEdit看看执行文件都是些什么内容。结果大吃一惊:基本上都是0。看来这个有减小的必要了。都知道,执行文件都有自己的代码段,数据段等等,每个段的大小也是采用编译器缺省设定的。好,我们来修改一下段的大小看看:
5.1 连接选项中有一个是/opt:nowin98,意思是将段的大小设定成为Win2000适应的。编译看看:哇塞,变成了2,560byte。看来这个选项确实把文件变小了N多。
5.2 在查察连接选项中还有没有什么特别的。发现/align:xx还可以将段大小缩小。通过UltraEdit察看刚才/opt:nowin98编译出来的文件,发现每个段的大小都是4K的整数倍。看来/align:xx还有减小的趋势。试一把再说:添加连接选项:/align:16(这个大小已经是能够设定的最小的了)。看看结果:1,408Bytes。厉害,现在代码更小了。
5.3 现在回想起来,执行文件大小有数据段,执行代码段等等,如果把这些段都合并起来,是不是就会把段之间的冗余有减小了呢?再试试看:添加选项:/merge:.data=.text /merge:.rdata=.text。再看看文件大小:1,328bytes。真的很不错了。
6、刚才的设定确实不错,似乎达到了我们想要的极限了。但是回头想一下,如果没有CRT库的话,会不会更小了?实际上确实这样。添加连接选项: /entry:main,把入口地址直接指向我们的main函数看看。得到592Bytes。
最终我们得到我们最后的大小592Bytes了。我想这也许是我们通过编译器能够编译出来的最小的代码了。
结论:
通过上述的步骤,我们了解了如何修改那些编译连接选项来达到执行文件瘦身的目的。但是,通常来讲,在我们的Release文件当中,并不需要如此小的执行文件。如果想达到瘦身的目的,修改为library:MutiThreaded Dll和添加/opt:nowin98已经是很好的选择了。其他别的选项在编译的时候或多或少的有警告出现,而且,带有那些编译选项编出来的执行文件也不一定在各个平台上能够适用。
另外:如果你的执行文件即使通过了这些设定还是比较大的话,也可以通过一些EXE文件压缩工具来进行压缩。比如UPX等等。在此不再细说了。
以上部分的不足之处,还请多多指正。 |
|
|
|
2006-12-29 08:01 |
|
|
poor
初级用户
积分 160
发帖 36
注册 2006-12-23
状态 离线
|
『第
3 楼』:
谢谢呀,真是大虾呀,好厉害。。。原来还有这么多玩法啊
可是,,可是,,,
我说实话吧,我的VC根本就没有IDE呀,呜呜呜。。。
我都是用命令行的,也不知道IDE还有这些功能哪。。。
刚看了一下,找了半天,终于找出来了。。
===================
这是cl.exe的说明
C/C++ COMPILER OPTIONS
-OPTIMIZATION-
/O1 minimize space /Op[-] improve floating-pt consistency
/O2 maximize speed /Os favor code space
/Oa assume no aliasing /Ot favor code speed
/Ob<n> inline expansion (default n=0) /Ow assume cross-function aliasing
/Od disable optimizations (default) /Ox maximum opts. (/Ogityb1 /Gs)
/Og enable global optimization /Oy[-] enable frame pointer omission
/Oi enable intrinsic functions
-CODE GENERATION-
/G3 optimize for 80386 /Gy separate functions for linker
/G4 optimize for 80486 /Ge force stack checking for all funcs
/G5 optimize for Pentium /Gs[num] disable stack checking calls
/G6 optimize for Pentium Pro /Gh enable hook function call
/GB optimize for blended model (default) /GR[-] enable C++ RTTI
/Gd __cdecl calling convention /GX[-] enable C++ EH (same as /EHsc)
/Gr __fastcall calling convention /Gi[-] enable incremental compilation
/Gz __stdcall calling convention /Gm[-] enable minimal rebuild
/GA optimize for Windows Application /EHs enable synchronous C++ EH
/GD optimize for Windows DLL /EHa enable asynchronous C++ EH
/Gf enable string pooling /EHc extern "C" defaults to nothrow
/GF enable read-only string pooling /QIfdiv[-] enable Pentium FDIV fix
/GZ enable runtime debug checks /QI0f[-] enable Pentium 0x0f fix
-OUTPUT FILES-
/Fa[file] name assembly listing file /Fo<file> name object file
/FA[sc] configure assembly listing /Fp<file> name precompiled header file
/Fd[file] name .PDB file /Fr[file] name source browser file
/Fe<file> name executable file /FR[file] name extended .SBR file
/Fm[file] name map file
-PREPROCESSOR-
/C don't strip comments /FI<file> name forced include file
/D<name>{=|#}<text> define macro /U<name> remove predefined macro
/E preprocess to stdout /u remove all predefined macros
/EP preprocess to stdout, no #line /I<dir> add to include search path
/P preprocess to file /X ignore "standard places"
-LANGUAGE-
/Zi enable debugging information /Zl omit default library name in .OBJ
/ZI enable Edit and Continue debug info /Zg generate function prototypes
/Z7 enable old-style debug info /Zs syntax check only
/Zd line number debugging info only /vd{0|1} disable/enable vtordisp
/Zp[n] pack structs on n-byte boundary /vm<x> type of pointers to members
/Za disable extensions (implies /Op) /noBool disable "bool" keyword
/Ze enable extensions (default)
-MISCELLANEOUS-
/?, /help print this help message /V<string> set version string
/c compile only, no link /w disable all warnings
/H<num> max external name length /W<n> set warning level (default n=1)
/J default char type is unsigned /WX treat warnings as errors
/nologo suppress copyright message /Yc[file] create .PCH file
/Tc<source file> compile file as .c /Yd put debug info in every .OBJ
/Tp<source file> compile file as .cpp /Yu[file] use .PCH file
/TC compile all files as .c /YX[file] automatic .PCH
/TP compile all files as .cpp /Zm<n> max memory alloc (% of default)
-LINKING-
/MD link with MSVCRT.LIB /MDd link with MSVCRTD.LIB debug lib
/ML link with LIBC.LIB /MLd link with LIBCD.LIB debug lib
/MT link with LIBCMT.LIB /MTd link with LIBCMTD.LIB debug lib
/LD Create .DLL /F<num> set stack size
/LDd Create .DLL debug libary /link [linker options and libraries]
=======================================
========================================
这是link.exe的说明:
Microsoft (R) Incremental Linker Version 6.00.8447
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.
usage: LINK [options] [files] [@commandfile]
options:
/ALIGN:#
/BASE:{address|@filename,key}
/COMMENT:comment
/DEBUG
/DEBUGTYPE:{CV|COFF}
/DEF:filename
/DEFAULTLIB:library
/DELAY:{NOBIND|UNLOAD}
/DELAYLOAD:dll
/DLL
/DRIVER[:{UPONLY|WDM}]
/ENTRY:symbol
/EXETYPE:DYNAMIC
/EXPORT:symbol
/FIXED[:NO]
/FORCE[:{MULTIPLE|UNRESOLVED}]
/GPSIZE:#
/HEAP:reserve[,commit]
/IMPLIB:filename
/INCLUDE:symbol
/INCREMENTAL:{YES|NO}
/LARGEADDRESSAWARE[:NO]
/LIBPATH:dir
/LINK50COMPAT
/MACHINE:{ALPHA|ARM|IX86|MIPS|MIPS16|MIPSR41XX|PPC|SH3|SH4}
/MAP[:filename]
/MAPINFO:{EXPORTS|FIXUPS|LINES}
/MERGE:from=to
/NODEFAULTLIB[:library]
/NOENTRY
/NOLOGO
/OPT:{ICF[,iterations]|NOICF|NOREF|NOWIN98|REF|WIN98}
/ORDER:@filename
/OUT:filename
/PDB:{filename|NONE}
/PDBTYPE:{CON[SOLIDATE]|SEPT[YPES]}
/PROFILE
/RELEASE
/SECTION:name,[E][R][W][S][D][K][L][P][X]
/STACK:reserve[,commit]
/STUB:filename
/SUBSYSTEM:{NATIVE|WINDOWS|CONSOLE|WINDOWSCE|POSIX}[,#[.##]]
/SWAPRUN:{CD|NET}
/TSAWARE[:NO]
/VERBOSE[:LIB]
/VERSION:#[.#]
/VXD
/WARN[:warninglevel]
/WINDOWSCE:{CONVERT|EMULATION}
/WS:AGGRESSIVE
==================================
好象在link里面有这项功能,谢谢乐,新年快乐。。。 :)
[ Last edited by poor on 2006-12-30 at 03:19 AM ]
|
|
2006-12-30 16:17 |
|
|
xxxxzzzz
初级用户
积分 138
发帖 54
注册 2006-10-7
状态 离线
|
『第
4 楼』:
ok
每个程序不论大小,都要加载基本功能,即使你没有使用,象基本輸入輸出視頻設制声音等基本全部己經加载.
|
|
2007-1-7 13:49 |
|
|
xxxxzzzz
初级用户
积分 138
发帖 54
注册 2006-10-7
状态 离线
|
|
2007-1-7 13:50 |
|
|
xxxxzzzz
初级用户
积分 138
发帖 54
注册 2006-10-7
状态 离线
|
|
2007-1-7 13:50 |
|
|
xxxxzzzz
初级用户
积分 138
发帖 54
注册 2006-10-7
状态 离线
|
|
2007-1-7 13:51 |
|