我最近在关于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库了。
所以,把所有内容都放在一个问题/请求中:
如果您在此主题上比我更先进,您如何优化/部署自己的应用程序并确保它们快速启动并且仅包含所需内容?
答案 0 :(得分:2)
我能想到的事情很少:
答案 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