Qt:如何让我的exe"重量"更轻

Qt: How can I make my exe 'weight' less

本文关键字:exe 重量 更轻 我的 Qt      更新时间:2023-10-16

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

问题是,程序可执行文件"weights"(不知道英文单词/表达式)8Mb(发布版本),我想知道:

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

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

  • ProgramMAIN(1.5MiB):企业的主程序
  • ProgramMAIN2(600KiB):企业的另一个重要程序
  • ProgramWP(8MiB):我的主程序(用Qt制作)
  • ProgramMINI(2.5Mib):我的主程序的迷你版(用Qt制作)
  • 程序3(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

我搜索并询问了一下,发现我可以在.pro文件中添加QMAKE_CXX_FLAGS+= -s行来删除不必要的符号,并且在执行并运行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放在那里并调用它?

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

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

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

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

    const char* str = "A very very long string"; // will bloat your executable
    BigDataType myData[] = { ... }; // will bloat your executable
    
  • 将嵌入的资源移动到外部文件中(甚至移动到网络中)。嵌入的图标、图像、字符串等)显著增加了二进制大小。参见Qt资源

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

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