我正在Fedora上使用Qt 4.8.5制作的程序(我们将其称为ProgramWP),并基于带有其QWizardPages的QWizard结构。该程序或多或少有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为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的一个分支。