我正在试图弄清楚如何缩小在最新的QT SDK(4.8.2)(基于mingw / g ++)下编译的EXE文件的大小。我正在开发一个vanilla c ++控制台应用程序,它有一个简单的循环,只有#includes iostream,当我注意到它生成的exe大约是465kb;比他们应该更大的方式!注释掉所有流的内容会将其降低到预期的5kb范围(尽管剩下的代码大部分已经死了)。这似乎根本不对,特别是因为我正在研究的另一个完整项目有一个QGLwidget,窗口,十几个数据结构和~3000个语句,只有大约126Kb的时钟。我缺少一些设置或标志吗?这是.pro,而cpp是微不足道的,没有Qt(基本上是getline和cout,有六个字符交换):
TEMPLATE = app
CONFIG += console
CONFIG -= app_bundle
CONFIG -= qt
SOURCES += main.cpp
QMAKE_CXXFLAGS_RELEASE += -O2
QMAKE_CXXFLAGS_RELEASE += -Os
我已经尝试了一些其他配置,它肯定在发布模式下编译(调试是> 3Mb),但我无法弄清楚为什么它如此臃肿。
我还查看了PE头,我看到它正在从libgcc_s_dw2-1.dll和mingwm10.dll导入一些函数,如果我能完全消除这些依赖关系会很好,特别是无论如何都不应该要求。我可以通过向.pro添加QMAKE_LFLAGS_RELEASE += -static
来使libgcc消失(以17kb的exe大小为代价),但mingwm10.dll保持不变,调用单个函数。
基于整体膨胀,以及编译器试图潜入的所有无用的框架内容(至少在网络中)。我猜这只是几个设置的问题,特别是对于一些默认的编译器标志,如-DQT_LARGEFILE_SUPPORT或-mthreads。这是编译输出(为强调添加了项目符号):
答案 0 :(得分:3)
使用mingw的一个问题是b2版本的binutils不支持死代码剥离(它删除了你实际上没有使用的库的部分。)为了降低我的大小可执行文件,我不得不使用这里的补丁从源代码修补和构建binutils:
http://sourceware.org/bugzilla/show_bug.cgi?id=11539
它有所帮助。但要使其正常工作,您需要使用以下方式重建所有内容
-fdata-sections -ffunction-sections
在所有内容的编译标志中(包括GCC,Qt,其他库和您自己的应用程序)和:
-Wl,--gc-sections
仅在您的应用程序的链接标志中。对我来说这是值得的,因为之前我的可执行文件的重量约为20MB,现在已经减半了,它们大约是10MB。这包括所有库(我静态链接),包括Qt,SDL和各种媒体库(如Vorbis,mpg123,FLAC等)。
虽然我想如果你在Windows上构建,那么做这一切并不容易。我使用Linux来构建所有内容的w32交叉编译版本,这样更容易。
答案 1 :(得分:2)
我想在-s
命令中添加。
该命令剥离所有debuging符号的编译二进制文件。通常,当您编译器编译某些内容时,它会将.exe文件中的类和函数名称保留为查找。这些符号将包括所有包含的标题。所以.exe文件将包含来自iostream
的符号,包括函数和类。
MinGW有nm.exe
,可以从cmd执行以列出文件中的所有符号。与strip.exe
一起剥离已创建的符号文件。