BastiBen BastiBen - 1 year ago 86
C++ Question

Building optimized Qt4 - "./configure" flags and their meanings

I recently followed a discussion on the Qt4-interest mailing list about whether it is legal or not to build a commercial/proprietary application and statically link Qt4 into it. While there are some non-proven ways of doing so (by providing object files and a Makefile, etc. to the customer), it doesn't sound like such a good idea afterall.

One of my projects is using the LGPL-licensed Qt4 libraries and I ship them as separate DLLs/Dylibs/so's to my customer, using a simple installer on all platforms. While this works pretty good so far, I'd like to optimize a) the size of the installer by reducing the Qt library size by just including what I need, b) increase the startup/loading speed of my application.

I'm familiar with compiling Qt myself, but Qt got a lot of flags and switches.

Right now I'm building with the following flags:

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

I'm not entirely sure which effect/impact the following flags have:

  • -no-stl

  • -no-javascript-jit

  • -no-nis

  • -separate-debug-info

  • -no-openvg

  • -no-mitshm

Is there anything else I can do, for instance, by providing optimization switches for the compiler, or "stripping" unused functions out of the built Qt library to make it smaller (which would be easy with static builds). I don't have much experience with that.

Oh, just as a side-note, my compiled application size is about 600 kb (non-stripped) when linking against Qt dynamically. I experimented with it and found it to be around 4 MB in size when I link statically; but that way I wouldn't have to include 40 MB of Qt libraries anymore.

So, to put everything above into a question/request:

If you are more advanced than me on this topic, how do you optimize/deploy your own applications and make sure they start fast and only contain what is needed?

rpg rpg
Answer Source

There are few things that I can think of:

  • use a compiler/linker combination that does good size optimizations. MSVC is much better at this than MinGW for instance. All the Qt release DLLs built with MSVC total at ~21 MB. Built with MinGW they total at ~41 MB. By the way, do you really need to ship all the DLLs?
  • use the -ltcg (Link-time code generation) flag to optimize across object files.
  • use preprocessor flags to exclude parts of the Qt functionality. e.g: QT_NO_STL = -no-stl.
  • try the mmx/3d now/sse2 flags
  • remove some of the styles (-no-style-)
Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download