构建优化的Qt4 - “./configure”标志及其含义

时间:2009-11-27 07:10:33

标签: c++ qt optimization deployment qt4

我最近在关于Qt4兴趣邮件列表的讨论中讨论了构建商业/专有应用程序以及将Qt4静态链接到它是否合法。虽然有一些未经证实的方法(通过向客户提供目标文件和Makefile等),但事后听起来并不是一个好主意。

我的一个项目是使用LGPL许可的Qt4库,我使用所有平台上的简单安装程序将它们作为单独的DLL / Dylibs / so发送给我的客户。虽然到目前为止这种方法非常好,但我想通过仅包含我需要的内容来减少Qt库大小来优化a)安装程序的大小.b)提高应用程序的启动/加载速度。

我熟悉自己编译Qt,但是Qt有很多标志和开关。

现在我正在使用以下标志构建:

./configure \
  -fast \
  -opensource \
  -qt-sql-sqlite \
  -nomake demos examples \
  -silent \
  -no-qt3support \
  -no-gif \
  -plugin-sql-mysql \
  -release \
  -no-xmlpatterns \
  -no-multimedia

我不完全确定以下标志有哪些影响/影响:

  • -no-stl
  • -no-javascript-jit
  • -no-nis
  • -separate-debug-info
  • -no-openvg
  • -no-mitshm

还有什么我可以做的,例如,为编译器提供优化开关,或者从构建的Qt库中“剥离”未使用的函数以使其更小(这对于静态构建来说很容易)。我对此没有多少经验。

哦,就像旁注一样,当我动态链接Qt时,我编译的应用程序大小约为600 kb(非剥离)。我对它进行了实验,发现静态链接时大小约为4 MB;但是这样我就不用再包含40 MB的Qt库了。

所以,把所有内容都放在一个问题/请求中:

如果您在此主题上比我更先进,您如何优化/部署自己的应用程序并确保它们快速启动并且仅包含所需内容?

4 个答案:

答案 0 :(得分:2)

我能想到的事情很少:

  • 使用执行良好大小优化的编译器/链接器组合。例如,MSVC比MinGW要好得多。所有使用MSVC构建的Qt版本DLL总共大约为21 MB。使用MinGW构建,它们的总容量约为41 MB。顺便说一下,你真的需要运送所有的DLL吗?
  • 使用-ltcg(链接时代码生成)标志来优化目标文件。
  • 使用预处理程序标志来排除部分Qt功能。例如:QT_NO_STL = -no-stl。
  • 尝试使用mmx / 3d now / sse2标志
  • 删除部分样式(-no-style - )

答案 1 :(得分:2)

当您跳过所有模块并且认为您不需要时,您可以继续使用qconfig工具(隐藏在$ QTDIR / tools /树中的那种)并删除单个类。只要注意依赖关系 - 你可能需要迭代几次才能构建Qt(例如,QSpinBox依赖于QValidator存在)。

在构建Qt时,特别是多次,-nomake标志是一个很好的节省时间。尝试-nomake示例-nomake演示。

答案 2 :(得分:0)

一般速度的另一个优化在于编译Qt时使用编译器优化,但您必须编辑一些文件。 当你从Git获得Qt时,你最终获得了qtbase / dir。 首先执行配置脚本,构建qmake

注意:您可以修改Makefile.win32或Makefile.unix并添加以下行:

QMAKE_CXXFLAGS_RELEASE = -CompilerDependentOptimizerSwitches 

如果你想要优化qmake,但我不认为这是真的有必要,考虑到qmake的运行时间可能是中型应用程序整个编译时间的0.0000001%。

但是在编辑用于构建Qt的mkspec时会出现真正的优化。

例如,在使用VS2012的Windows下,您可能会修改qtbase/mkspecs/win32-msvc2012/qmake.conf

实施例。 :在默认Qt5.1上,msvc2012 mkspec读取:

QMAKE_CFLAGS_RELEASE    = -O2 -MD
QMAKE_CXXFLAGS_RELEASE  = $$QMAKE_CFLAGS_RELEASE

由于您要优化尺寸,可以将其替换为:

QMAKE_CFLAGS_RELEASE    = -O1 -MD

(根据http://msdn.microsoft.com/en-us/library/8f8h5cxt.aspx

有时它包含qtbase/mkspecs/common/ dir中的更多高级mkspec。

我在Debian / g ++ 4.8.1上使用-O3 -march=native(默认为-O2)成功编译了Qt5.1,如果它可以为任何人服务。

执行此操作后,只需在Qt git root上运行make,然后与您的团队一起喝啤酒,因为即使在一台好的计算机上,它也需要很长时间(在i7上大约需要2小时,没有构建演示/示例,但是WebKit的)。

答案 3 :(得分:0)

sed -i 's@QMAKE_CXXFLAGS_THREAD  += $$QMAKE_CFLAGS_THREAD@QMAKE_CXXFLAGS_THREAD  += $$QMAKE_CFLAGS_THREAD -march=native@g'  qtbase/mkspecs/common/linux.conf

将在Linux上优化Qt5.8