c++ - Qt:我怎样才能减少我的exe 'weight'

标签 c++ qt gcc qt4

我正在 Fedora 上用 Qt 4.8.5 制作一个程序(我们称它为 ProgramWP),它基于 QWizard 结构及其 QWizardPages。该程序大约有 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 是 600Kibs 与链接库,我的 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 放在那里并调用它?

最佳答案

这里有一些减少可执行文件大小的技巧:

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

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

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

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

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

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

关于c++ - Qt:我怎样才能减少我的exe 'weight',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34265858/

相关文章:

c++ - QAbstractTableModel编辑而不清除单元格中的先前数据

c - 即使使用 -gdwarf-2,GCC 4.8 也会在编译单元 header 中插入版本 4

c++ - 我应该使与可调时钟一起工作的成员函数静态化吗?

c++ - 使用 C++ 在 Xcode 6.1.1 下编译简单的 OpenCL 示例代码时出现问题

c++ - 连接二进制位大小的字符串

java - QT 或 java 哪个环境更便携?您建议使用哪个环境来满足我的应用程序需求?

css - Style QtComboBox, QListViewItem - 设置文本填充

c - 如何仅使用 C 编程语言用 GCC 编译 Allegro 5 程序

c - 链接器错误 :/usr/bin/ld: cannot find -lc

c++ - std::vector 是否比 std::list 更容易失败(STL 容器)