Qt:如何让我的 exe 'weight' 更少
Qt: How can I make my exe 'weight' less
我正在 Fedora 上用 Qt 4.8.5 制作一个程序(让我们称之为 ProgramWP),它基于 QWizard 结构及其 QWizardPages。该程序大约有50个类,其中30个是QWizardPages。
问题是程序可执行文件 'weights'(不知道英文 word/expression)8Mb(发行版),我想知道:
- 为什么这么重?这是什么原因?
- 我怎样才能减少它?
我需要减少它,因为在企业的产品中,有一些应用程序运行ing,其中一些是我的。支持 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 文件中以删除不必要的符号,并且在执行此操作并 运行ing 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 的一个分支,如果它做得更好的话。
我正在 Fedora 上用 Qt 4.8.5 制作一个程序(让我们称之为 ProgramWP),它基于 QWizard 结构及其 QWizardPages。该程序大约有50个类,其中30个是QWizardPages。
问题是程序可执行文件 'weights'(不知道英文 word/expression)8Mb(发行版),我想知道:
- 为什么这么重?这是什么原因?
- 我怎样才能减少它?
我需要减少它,因为在企业的产品中,有一些应用程序运行ing,其中一些是我的。支持 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 文件中以删除不必要的符号,并且在执行此操作并 运行ing 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 的一个分支,如果它做得更好的话。