【问题标题】:Building optimized Qt4 - "./configure" flags and their meanings构建优化的 Qt4 - "./configure" 标志及其含义
【发布时间】:2009-11-27 07:10:33
【问题描述】:

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

我的一个项目是使用 LGPL 许可的 Qt4 库,我使用所有平台上的简单安装程序将它们作为单独的 DLL/Dylibs/so 发送给我的客户。虽然到目前为止这工作得很好,但我想优化 a) 通过仅包含我需要的内容来减少 Qt 库大小来优化安装程序的大小,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 库了。

因此,将以上所有内容放入问题/请求中:

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

【问题讨论】:

    标签: c++ qt optimization deployment qt4


    【解决方案1】:

    我能想到的东西很少:

    • 使用可进行大小优化的编译器/链接器组合。例如,MSVC 在这方面比 MinGW 好得多。使用 MSVC 构建的所有 Qt 版本 DLL 总计约为 21 MB。使用 MinGW 构建,它们的总大小约为 41 MB。顺便说一句,您真的需要发送所有的 DLL 吗?
    • 使用 -ltcg(链接时代码生成)标志跨目标文件进行优化。
    • 使用预处理器标志来排除部分 Qt 功能。例如:QT_NO_STL = -no-stl。
    • 立即尝试 mmx/3d/sse2 标志
    • 删除一些样式(-no-style-)

    【讨论】:

    • 感谢您的回复!实际上,我只是运送需要的东西,包括 QtCore、QtGui、QtWebKit、QtXml、QtSql 和 QtNetwork。当我使用-no-stl 时,我会遇到什么问题?我将尝试了解有关链接时代码生成的更多信息,因为这似乎很有趣。排除一些样式也是一个很好的主意,因为我只是在 OS X/Windows 上使用原生样式。
    • 你将失去QString和basic_string之间以及QTL容器和STL包含之间的转换函数。
    • 感谢您解决这个问题。我不记得在任何地方都使用过 STL 类/类型。通常Qt的东西对我来说很好用。 :)
    【解决方案2】:

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

    在构建 Qt 时,尤其是多次构建时,-nomake 标志非常节省时间。试试 -nomake examples -nomake demos。

    【讨论】:

      【解决方案3】:

      另一个对一般速度的优化在于在编译 Qt 时使用编译器优化,但您必须编辑一些文件。 当你从 Git 获取 Qt 时,你最终会得到一个 qtbase/ 目录。 首先执行配置脚本,构建 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/ 目录中找到的更多高级 mkspec。

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

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

      【讨论】:

        【解决方案4】:
        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

        【讨论】:

          猜你喜欢
          • 2011-02-19
          • 2017-09-04
          • 2018-04-28
          • 1970-01-01
          • 1970-01-01
          • 2018-07-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多