臃肿的 EXE 大小以及与 Qt/MingW 的不必要的依赖关系

2023-11-23

我试图弄清楚如何缩小在最新的 QT SDK (4.8.2)(基于 mingw/g++)下编译的 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 导入一些函数,如果我也能完全消除这些依赖项,那就太好了,特别是因为两者都不应该无论如何都需要。我可以通过添加来使 libgcc 消失(以 17kb 的 exe 大小为代价)QMAKE_LFLAGS_RELEASE += -static到 .pro,但 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,-子系统,控制台 -mthreads -orelease\conTest.exerelease/main.o
  • mingw32-make[1]:离开目录 `C:/Documents and Settings/Administrator/My Documents/QT/conTest'
  • 14:04:10: 进程“C:\QtSDK\mingw\bin\mingw32-make.exe”正常退出。

使用 mingw 的问题之一是 binutils 的 w32 版本不支持死代码剥离(它会删除您实际不使用的库部分)。为了减小可执行文件的大小,我必须使用此处的补丁从源代码修补和构建 binutils:

http://sourceware.org/bugzilla/show_bug.cgi?id=11539

这有帮助。但要使其发挥作用,您需要重建一切 using:


-fdata-sections -ffunction-sections  

在所有东西的编译标志中(包括 GCC、Qt、其他库)and您自己的应用程序)以及:


-Wl,--gc-sections  

仅在您的应用程序的链接标志中。这对我来说是值得的,因为以前我的可执行文件大小约为 20MB,现在已减半,约为 10MB。这包括all库(我静态链接),包括 Qt、SDL 和各种媒体库(如 Vorbis、mpg123、FLAC 等)。

尽管我认为如果您在 Windows 上进行构建,那么完成这一切并不容易。我使用 Linux 构建所有内容的 w32 交叉编译版本,这要容易得多。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

臃肿的 EXE 大小以及与 Qt/MingW 的不必要的依赖关系 的相关文章

随机推荐