Let's build small Qt libraries! (Step 2: Optimize build-settings)
-
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 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-inlineNeither 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). -
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). -
[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... :( -
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@
-
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.