Let's build small Qt libraries! (Step 2: Optimize build-settings)



  • I've never used UPX for Qt Framework because I didn't have to...there are just big libraries for debugging (I think QtGuid.dll has around 140MB), for release, they don't have things for debugging so it spends much less space on your harddisk...

    How much it spends in your computer?



  • With UPX -9 packed my tool (including all libraries) is around 9 MB in size (with the release-libraries)

    I know we can smash it down further!



  • hi,
    i noticed upx not support PE+ or win64, might use mpress http://www.matcode.com/mpress.htm
    it work like a charm.. :)



  • I will try mpress as well.

    To get qconfig compiled I will build the whole Qt Suite again with some exceptions (-nomake examples -nomake demos).



  • 9MB is too much?

    I suppose you do it for school. In that way, I think you should use "static" release, it adds Qt Framework Libraries into your project libraries, so you won't have to carry Qt DLLs with project, but it will have to effect on size of your binaries, after that you should use UPX....



  • I've already programmed this tool twice (in Object Pascal and C#). The tool was always around 2-3 MB in size.

    I don't want to scare my users off and am generally interested in this whole build-improvement thing.

    Binding it statically won't reduce the size much (and isn't allowed in that context either if I go LGPGL).

    @Peppy: I will try the MSVC-compiler as well.



  • As you're on Windows using MinGW (I know your project quite good now :-) ) you must add the respective mkspec:

    @
    ./configure -platform win32-gcc ... your additional args go here ....
    @

    The rest of your no-xxx switches does not influence the size very significantly. It just leaves out the build of some submodules and the like, which you would not put into your final applications directory anyways.

    Be sure to create release libs (without debugging symbols), this decreases the size of the libs significantly!

    And finally you can try to run MinGW/bin/strip.exe on every executable and library (DLL) you have in your directory. I did not try this yet, but at least on Unix this reduces the size even more.

    For distribution, put it all in a ZIP. UPX and the like is not really useful IMHO. The exe and the libs must be decompressed eventually to run the program, thus slowing down the start up time of your application.

    Remember: Disk space is cheap :-)



  • @Volker: I thought so. But I am very surpised that somebody wants to compress binaries on the maximum in time when we have 2-3 TBytes harddisks (no everybody has terabytes harddrives, but 16MB is not so much...)...

    I am compiling under MSVC 2008 compiler and it's quite better than MinGW (IMHO)...

    BTW. What is the name of your project? :-)



  • bq. As you’re on Windows using MinGW (I know your project quite good now :-) ) you must add the respective mkspec:
    ./configure -platform win32-gcc ... your additional args go here ....

    Just making sure. So I need to attach the compiler-switches like -fmerge-all-constants already in the configure-step?

    These are the Qt-dll's and their sizes my program currently needs:

    @Uncompressed size | UPX -9 size | Name

      2,43MB          |    0,91MB    | QTCore4.dll
      2,92MB          |    0,86MB    | QTDeclarative4.dll
      9,39MB          |    3,69MB    | QtGui4.dll
      1,15MB          |    0,40MB    | QTNetwork4.dll
      2,07MB          |    0,65MB    | QTScript4.dll
      0,20MB          |    0,10MB    | QTSql4.dll
      3,82MB          |    0,94MB    | QTXmlPatterns4.dll
    

     21,98MB              7,55MB@
    

    Especially QtGui4.dll should be reducable much further since I'm using exclusively QML (with Jens desktop-components) for the GUI.



  • Quite big difference...but there is a good question: Do you need it? Will it help you as you are waiting? Has the binary compression any result on booting (I mean loading) time?



  • The DLLs cannot be shrunk, unfortunately. They contain all the symbols of the module, even if you only need one of them. And QML of course depends heavily on the widgets in QtGui :-)



  • DLLs should get redesigned, this system is too old (from Windows 95, I think), but that's the work of Microsoft...



  • So even qconfig won't help?
    I could exclude some widgets in the sourcecode but that is a bit too much (imagine I need to do this for every new qt-version).

    strip <file> -s didn't really do much. Any other useful parameters?

    What I am aiming for is a small download-size for users.



  • -o1, ..., -o5 for MinGW



  • Where do I use these flags?

    I initially asked where I can apply the compiler-flags:

    bq. -Os
    -fmerge-all-constants
    -fno-default-inline
    -fno-inline

    Neither configure nor mingw32-make accept them.



  • [quote author="Peppy" date="1305654867"]DLLs should get redesigned, this system is too old (from Windows 95, I think), but that's the work of Microsoft...[/quote]

    Shared libraries (.so on unix/linux, .dylib on Macs) behave just the same way! They were intended to reduce the memory footprint (a shared library is loaded into memory only once and used by multiple programs), as well as disk space. Both are not so an issue anymore these days.

    So, a Mac application bundle is "bloated" too, as would be a linux archive containing all necessary non-system libraries.



  • [quote author="Hedge" date="1305654933"]So even qconfig won't help?
    I could exclude some widgets in the sourcecode but that is a bit too much (imagine I need to do this for every new qt-version).

    strip <file> -s didn't really do much. Any other useful parameters?

    What I am aiming for is a small download-size for users.[/quote]

    No, qconfig does not help. The DLLs will always contain all widgets.

    strip regularly does not save very much space on binaries compiled in release mode already.

    If you're only after a small download size, use a decent archiver and set it's mode to maximum compression.

    [quote author="Hedge" date="1305655290"]Where do I use these flags?

    I initially asked where I can apply the compiler-flags:

    bq. -Os
    -fmerge-all-constants
    -fno-default-inline
    -fno-inline

    Neither configure nor mingw32-make accept them.[/quote]

    These are compiler/linker flags, you can try to set them for configure this way:

    @
    CFLAGS="-Os -fmerge-all-constants -fno-default-inline -fno-inline"
    ./configure -platform win32-g++
    your additional flags go here
    @

    But be aware that fiddling with optimization settings (-Os) may make things worse or add a runtime slowdown penalty.



  • But they were designed about 20 years before, and probably they will change...

    But back to the topic, I don't remember what it was...

    I think: http://wiki.wxwidgets.org/Reducing_Executable_Size (--strip-all)



  • Thanks for clarifying that CFLAGS-thing. I'm currently writing my BA so I've got time to try some configurations (and also the MSVC-compiler).

    I'll post the details here.

    However I've a problem atm ...size-wise.
    My application, although build in release-mode asks for the debug-DLLs as well (QtGui4d.dll etc.) when I try to execute it on another PC. Any ideas what would could've gone wrong?
    The executables size is much smaller than in debug-mode (400kb vs. 2.4MB).



  • Yes, executable is much more smaller than DLLs (who knows why?)...

    Why that happens? Good question... Please make new thread, it's new question, and it'll going to off topic...



  • There's already a thread "here":here http://developer.qt.nokia.com/forums/viewthread/6033/ regarding that question but no one had a good idea yet.
    I threw it in b/c it didn't seem to be too off-topic (it's influencing the application-size in a very bad way).



  • Yes, but this topic is named as "Minimizing sizes of DLLs" not as "Issue with DLLs" ;) That's just detial, but that I've learnt on other board as moderator (just my habit :-D)

    Yes, it's quite strange...



  • [quote author="Hedge" date="1305656526"]
    However I've a problem atm ...size-wise.
    My application, although build in release-mode asks for the debug-DLLs as well (QtGui4d.dll etc.) when I try to execute it on another PC. Any ideas what would could've gone wrong?
    The executables size is much smaller than in debug-mode (400kb vs. 2.4MB).
    [/quote]
    if you're using UPX....
    try delete pagefile.sys of your compiler's pc, than run your apps than something going haven...
    sadly crash in previous trial... :(



  • The problem was another dll build in debug-mode. Peppy found the solution in the thread mentioned above.



  • I've got some results to show off.

    I can't run configure with the Microsoft-compiler ("Your text to link here...":http://developer.qt.nokia.com/forums/viewthread/6060/).

    For now I built Qt with the following configure-options:

    @Configure -L -release -platform win32-g++ -opensource -no-exceptions -no-stl -no-opengl -no-openvg -no-libjpeg -no-libtiff -no-dsp -no-vcproj -no-webkit -no-scripttools -no-native-gestures -qconfig ali@

    I checked off as much stuff as possible in my custom config-file but especially didn't know which GUI-components I could remove (I use the qml-desktop-components).

    The result is a lower size of around 1MB (6,51MB compared to 7,55MB before)

    @default size | self-compiled(gcc) | UPX -9 | Name

      2,43MB        |      2,04MB        |    0,80MB    | QTCore4.dll
      2,92MB        |      2,23MB        |    0,67MB    | QTDeclarative4.dll
      9,39MB        |      7,75MB        |    3,19MB    | QtGui4.dll
      1,15MB        |      0,77MB        |    0,28MB    | QTNetwork4.dll
      2,07MB        |      1,74MB        |    0,55MB    | QTScript4.dll
      0,20MB        |      0,20MB        |    0,08MB    | QTSql4.dll
      3,82MB        |      3,82MB        |    0,94MB    | QTXmlPatterns4.dll (wasn't compiled)
    

     21,98MB              18,55MB             6,51MB@
    

    These were the old results:

    @Uncompressed size | UPX -9 size | Name

      2,43MB          |    0,91MB    | QTCore4.dll
      2,92MB          |    0,86MB    | QTDeclarative4.dll
      9,39MB          |    3,69MB    | QtGui4.dll
      1,15MB          |    0,40MB    | QTNetwork4.dll
      2,07MB          |    0,65MB    | QTScript4.dll
      0,20MB          |    0,10MB    | QTSql4.dll
      3,82MB          |    0,94MB    | QTXmlPatterns4.dll
    

     21,98MB              7,55MB@


  • From 22MB to 6,5MB is quite good ;-) ... Do you have any start-up "speed" test? Is it slower/faster ?



  • No, my application doesn't work standalone right now in release-mode because of the problem mentioned in another thread.



  • Now I've compiled using MSVC2010 and excluding just a bit stuff (-no-stl, -no-exceptions etc).

    These are the new results:

    The result is a lower size of around 0,71 MB compared to the GCC-built libraries.

    I'm trying to compile with exceptions now so I can get XMLPatterns built.

    @default size | self-compiled(MSVC)| UPX -9 | Name

      2,43MB        |      1,85MB        |    0,82MB    | QTCore4.dll
      2,92MB        |      1,71MB        |    0,58MB    | QTDeclarative4.dll
      9,39MB        |      6,57MB        |    3,02MB    | QtGui4.dll
      1,15MB        |      0,59MB        |    0,24MB    | QTNetwork4.dll
      2,07MB        |      1,05MB        |    0,37MB    | QTScript4.dll
      0,20MB        |      0,13MB        |    0,07MB    | QTSql4.dll
      3,82MB        |      2,52MB        |    0,60MB    | QTXmlPatterns4.dll
    

     21,98MB              14,32MB             5,70MB@
    

    These were the old results:

    @Uncompressed size | UPX -9 size | Name

      2,43MB          |    0,91MB    | QTCore4.dll
      2,92MB          |    0,86MB    | QTDeclarative4.dll
      9,39MB          |    3,69MB    | QtGui4.dll
      1,15MB          |    0,40MB    | QTNetwork4.dll
      2,07MB          |    0,65MB    | QTScript4.dll
      0,20MB          |    0,10MB    | QTSql4.dll
      3,82MB          |    0,94MB    | QTXmlPatterns4.dll
    

     21,98MB              7,55MB@


  • Hi,

    I'm using Qt on WinCE 5, and using qconfig to rip out all of the QWidgets that I don't use, and compiling for optimize for size rather than speed I've managed to get QtGui down to between 5 and 6MB depending on the platform.

    I've also remove QtSql and QtSvg support from QtDeclarative (as I don't use them) and that means another couple of hundred K that's saved. These changes are very minor code changes to the library.

    Steve



  • Actually, I think some (groups of) widgets can be left out, by using the right #defines. In qabstractitemview.h, line 56, for instance, there is a conditional compilation like this:
    @
    #ifndef QT_NO_ITEMVIEWS
    @

    Another example is for XML (xmlstream.h, line 47):
    @
    #ifndef QT_NO_XMLSTREAM
    @

    I think that many Qt features can be compiled out this way, thus reducing the size of the Qt libraries.



  • @SteveKing, could you upload your qconfig somewhere? The example-ones distributed with Qt don't work at all and I couldn't get my own to compile past QtDeclarative.

    I'm also intersted in the changes you made to leave out QtSql and QtSvg in QtDeclarative.

    @Andre: That's the purpose of qconfig.
    It adds define QT_NO_WHATEVER statements, but I found it difficulty to find a fully compiling configuration.



  • @Hedge. Our "company website":http://www.domino-printing.com/Global/en/QuickStepQTFiles/QuickStepQTFiles.aspx has all of the Qt files we're using on it. The things you'll be interested in are:

    4.7.2 Changed Files: This zip has the source I modified in Qt Declarative to remove the Sql support and the configuration files. It also includes a change to the Pixmap cache class to allow us to define the cache size.

    4.7.2 Configuration Batch Files: This has the mkspecs for our WinCE platforms and also the configure batch files we use. Some of the configure options I've used don't do anything (-nomake), but I threw everything at it and haven't tidied them up yet!

    The qconfig-QML.h is the minimum config for our WinCE application. _QML-http-html _and _QML-IC _are variations on this adding in some extra features as required. _QML-PC _is the minimum config I managed for a PC build, although even with this I hit problems building the active Qt components. I tried to fix this by modifying .pro files etc, but got nowhere and everything I use has been built by then so I stopped. The main reason the _qconfig-QML _didn't work with the PC build was because of all the tools that build with it, again I didn't investigate how to disable these.

    If you find any of this useful and need to ask any more questions feel free to mail me.

    Steve



  • Thanks for putting them up.
    I'll try them as soon as I find the time to.

    EDIT: I couldn't compile them. I think I'm out for now as Volker is right. It's eating plenty of time.


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.