gpt4 book ai didi

c++ - 膨胀的 EXE 大小,以及不需要的 Qt/MingW 依赖项

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:30:43 24 4
gpt4 key购买 nike

我正在尝试找出如何缩小在最新的 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

我已经尝试了一些其他的配置,它肯定是在 Release模式下编译的(调试是 >3Mb),但我不明白为什么它这么臃肿。

我还查看了 PE 头文件,我看到它从 libgcc_s_dw2-1.dll 和 mingwm10.dll 导入了一些函数,如果我也能完全消除这些依赖关系就好了,尤其是因为无论如何都不需要。我可以通过将 QMAKE_LFLAGS_RELEASE += -static 添加到 .pro 来使 libgcc 消失(以 17kb 的 exe 大小为代价),但 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 发布/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

很有帮助。但要使其正常工作,您需要使用以下方法重建一切:

-fdata-sections -ffunction-sections

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

-Wl,--gc-sections

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

尽管我认为如果您在 Windows 上构建,要做到这一切并不容易。我使用 Linux 构建所有内容的 w32 交叉编译版本,这更容易。

关于c++ - 膨胀的 EXE 大小,以及不需要的 Qt/MingW 依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12449387/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com