Qt:我怎样才能减少我的 exe 的“重量”

Posted

技术标签:

【中文标题】Qt:我怎样才能减少我的 exe 的“重量”【英文标题】:Qt: How can I make my exe 'weight' less 【发布时间】:2015-12-14 11:25:07 【问题描述】:

我正在Fedora 上使用Qt 4.8.5 制作一个程序(我们称之为ProgramWP),它基于带有QWizardPages 的QWizard 结构。该程序大约有 50 个类,其中 30 个是 QWizardPages。

问题是程序可执行“权重”(不知道英文单词/表达式)8Mb(发行版),我想知道:

为什么这么重?是什么原因? 如何减少它?

我需要减少它,因为在企业的产品中,有一些应用程序在运行,其中一些是我的。支持 exe 的:

ProgramMAIN (1.5MiB):企业主程序。 ProgramMAIN2(600KiB):企业的另一个重要程序。 ProgramWP(8MiB):我的主程序(使用 Qt 制作)。 ProgramMINI(2.5Mib):我的主程序的迷你版(使用 Qt 制作)。 Program3(1.3MiB):我用 Qt 制作的另一个程序

正如您所见,我的主程序比主程序的权重如此之多,而主程序却大得多(ProgramWP 只是一个用于配置一些简单事情的小程序)。

我在 ProgramWP 和 ProgramMINI 中静态链接了我们的一些库,但 programMAIn 和 ProgramMAIN2 也是如此...知道 ProgramMain2 与链接库的大小为 600Kib,我的 ProgramWP 的重量不应超过此。

这就是我在 .pro 文件中进行链接的方式:

unix:!macx: LIBS += -L$PWD/../../ConfigLib/Release/ -lLib1
INCLUDEPATH += $PWD/../../Lib1
DEPENDPATH += $PWD/../../Libs/Release
unix:!macx: PRE_TARGETDEPS += $PWD/../../Libs/Release/Lib1.a

我已经搜索并询问,发现我可以将QMAKE_CXX_FLAGS+= -s 行添加到.pro 文件中以删除不必要的符号,并且在执行此操作并运行 qmake 之后,它的重量仍然相同(就像它被忽略了一样)。我看看 gcc 是否使用 -s 参数并重建我得到:

g++ -c -pipe -std=c++11 -s -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fstack-protector --param=ssp-buffer-size=4 -m32 -march=i686 -mtune=atom -fasynchronous-unwind-tables -O2 -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_SCRIPT_LIB -DQT_XML_LIB -DQT_GUI_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/lib/qt4/mkspecs/linux-g++ -I../MyProject-I/usr/include/QtCore -I/usr/include/QtNetwork -I/usr/include/QtGui -I/usr/include/QtXml -I/usr/include/QtScript -I/usr/include -I../../Utils -I../../Lib1-I../../Lib2-I../../Lib3-I../../Lib4-I. -I. -I../MyProject-I. -o wp2.o ../MyProject/wpmine.cpp

如您所见,gcc 似乎使用了该参数...知道为什么它这么重以及如何解决它吗?

非常感谢。

注意:他们的程序基本上是用 eclipse 和 c++ 制作的,而我的程序是用 Qt 制作的。为了运行它,他们在企业产品中安装了一些 Qt 库,所以另一个问题是......他们可以在没有安装这些库的情况下运行我的程序吗?只是把exe放在那里然后调用它?

【问题讨论】:

可执行文件和它一样大,因为 Qt 是一个臃肿的库。想让它变小吗?远离 Qt。 哈哈哈太好了 :) 但是我的老板希望这个程序是用 Qt 制作的,现在他们希望它比他们的程序更轻……我会在主帖中添加一个关于它的注释,因为他们的程序是用eclipse和c++编写的 EXE 的大小无关紧要。如果要部署 Qt 应用程序,则必须在应用程序旁边提供支持库(Windows 上的 DLL)。对于什么都不做的标准应用程序,它们的大小约为 30MiB。 我怎样才能减轻我的前任体重。关闭主题,因为关系和健康相关问题都不适合 *** ;) @Drop 等等... WHAAAAAAAT!!!我使用了像 strip exename 这样的条带,它从 8Mib 变成了 550KiB O.o 哇!我想它仍然会完美运行,但它令人难以置信!在将其发布为答案并接受之前...我没有多种语言,是的数组字节,不知道这里有什么着色器代码...但是您的意思是使用 xml 例如来放置一些信息? 【参考方案1】:

以下是一些减少可执行文件大小的技巧:

您可能希望在可执行文件上使用strip(以防编译器的-s 标志出现问题)

使用-Os 标志编译可能会略微减小可执行文件大小

减小可执行文件数据段的大小。请注意,每个常量(包括字符串文字、静态数组初始值设定项等)都存储在可执行文件中并增加其大小:

const char* str = "A very very long string"; // will bloat your executable

BigDataType myData[] =  ... ; // will bloat your executable

将嵌入式资源移动到外部文件(甚至网络)。嵌入的图标、图像、字符串等)显着增加了二进制大小。见QtResource

减少模板化代码的使用。大量使用模板(连同它们的实例化)是代码膨胀的一个众所周知的原因。这是代码大小和代码美观之间的权衡。

你可能想试试CopperSpice,Qt 的一个分支,如果它做得更好的话。

【讨论】:

如何删除 gcc 行中的第二个 -O2?将资源移动到外部文件你的意思是像使用 xml 来存储数据? 我不知道第二个-O2 来自哪里。检查您的.pro 文件。当然,您可以以 XML 或您喜欢的任何格式存储数据,这取决于它是什么类型的数据以及您的偏好。这个想法是将数据从可执行文件中移到其他地方,从而减少可执行文件的大小。 好吧,我在 pro 文件中没有比QT += core gui QT += network QT += script QT += date QT += time QT += xml QMAKE_CXXFLAGS += -std=c++11 QMAKE_CXXFLAGS += -s 更多的东西,所以不知道第二个 O2 这就是我问的原因。关于 xml,我已经将它们用于一些组合框和所有这些的大型信息。 就在您高兴地离开之前...您是否尝试过部署此二进制文件(在目标上运行)?因为您将在某处需要 Qt 库。我相信您将需要: Qt(相同版本)安装在目标上,b。将所需的 Qt dll 与目标上的二进制文件一起复制,或者 c.创建一个静态构建(自给自足),即使剥离也会超过 30mb... @code_fodder 嗨,代码,感谢您的建议 :) 但是是的,我们已经在目标上安装了 qt,而且我们已经在其上运行了程序并且运行正常 :) 也感谢您的建议.我有一个问题,我是否需要目标上的所有这些东西,但正如我现在所看到的,我想是的,我们不能删除它们。

以上是关于Qt:我怎样才能减少我的 exe 的“重量”的主要内容,如果未能解决你的问题,请参考以下文章

qt静态编译后怎样打包exe文件

13 个球一个天平,现知道只有一个和其它的重量不同,问怎样称才能用三次就找到那个球?

我怎样才能等到 Qt 的 keyevents 中的每个进程完成?

斯威夫特:我怎样才能减少 didupdatelocation 调用

我怎样才能给这些卡片元素相同的大小?

怎样才能减少2.5%的书写盒val?