我试图弄清楚如何缩小在最新的 QT SDK (4.8.2) (mingw/g++ based) 下编译的 EXE 文件的大小。我正在开发一个香草 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 使 libgcc 消失(以 17kb 的 exe 大小为代价)QMAKE_LFLAGS_RELEASE += -static
,但 mingwm10.dll 仍然存在,调用单个函数。
基于整体膨胀,以及编译器试图潜入的所有无用框架的东西(至少是网络)。我猜这只是一些歪斜的设置的问题,尤其是一些默认编译器标志,如 -DQT_LARGEFILE_SUPPORT 或 -mthreads。这是编译输出(为强调而添加的项目符号):
- 14:04:00:项目竞赛的运行步骤...
- 14:04:00:配置不变,跳过 qmake 步骤。
- 14:04:01:开始:“C:\QtSDK\mingw\bin\mingw32-make.exe”
- C:/QtSDK/mingw/bin/mingw32-make -f Makefile.Release
- mingw32-make[1]: 进入目录`C:/Documents and Settings/Administrator/My Documents/QT/conTest'
- g++ -c -O2 -O2 -Os -frtti -fexceptions -mthreads -Wall -DUNICODE -DQT_LARGEFILE_SUPPORT -I"c:\QtSDK\Desktop\Qt\4.8.1\mingw\mkspecs\win32-g++" -o release\main .o main.cpp g++ -Wl,-s -Wl,-subsystem,console -mthreads -o release\conTest.exe release/main.o
- mingw32-make[1]: 离开目录`C:/Documents and Settings/Administrator/My Documents/QT/conTest'
- 14:04:10:进程“C:\QtSDK\mingw\bin\mingw32-make.exe”正常退出。