[Qt-interest] Qt 4.6.1, Qt JPEG plugin and macdeploy: bus error because it loads two copies of the Qt frameworks
Marco Molteni
marco.molteni at laposte.net
Tue Feb 2 11:20:28 CET 2010
Hi all,
here is my setup: MacOSX 10.5, Qt 4.6.1 (carbon), project built with
cmake. I do not play any trick at all in the compilation or linking
phase.
The code loads some JPEG images, and so it uses the libqjpeg.dylib Qt
plugin.
The bundle runs correctly as built, with all the references to the Qt
frameworks resolved to /Library/Frameworks/QtXXX.
The problem comes if I try to prepare the bundle for deployment, using
macdeployqt.
Running macdeployqt works fine, and it creates correctly the
Frameworks directory below the bundle directory and also Resources/
qt.conf, mapping the plugins to the local, macdeplyqt-created
directory PlugIns. Running otool -L on the various libraries, and also
on the plugins seem to give the expected result.
But, when running the bundle prapared by macdeployqt, it gets a bus
error. The debug output, by setting DYLD_PRINT_LIBRARIES and
QT_DEBUG_PLUGINS is as follows:
$ DYLD_PRINT_LIBRARIES=1 QT_DEBUG_PLUGINS=1 ./Octopus.app/Contents/
MacOS/Octopus 2> q
$ cat q | grep Qt | head -14 | cat -n
1 dyld: loaded: /Users/mmolteni/src/octopus-hgsvn/qtcreator-
build/octopus-gui/./Octopus.app/Contents/MacOS/../Frameworks/
QtGui.framework/Versions/4/QtGui
2 dyld: loaded: /Users/mmolteni/src/octopus-hgsvn/qtcreator-
build/octopus-gui/./Octopus.app/Contents/MacOS/../Frameworks/
QtXml.framework/Versions/4/QtXml
3 dyld: loaded: /Users/mmolteni/src/octopus-hgsvn/qtcreator-
build/octopus-gui/./Octopus.app/Contents/MacOS/../Frameworks/
QtNetwork.framework/Versions/4/QtNetwork
4 dyld: loaded: /Users/mmolteni/src/octopus-hgsvn/qtcreator-
build/octopus-gui/./Octopus.app/Contents/MacOS/../Frameworks/
QtCore.framework/Versions/4/QtCore
5 QFactoryLoader::QFactoryLoader() looking at "/Developer/
Applications/Qt/plugins/imageformats/libqgif.dylib"
6 QFactoryLoader::QFactoryLoader() looking at "/Developer/
Applications/Qt/plugins/imageformats/libqico.dylib"
7 QFactoryLoader::QFactoryLoader() looking at "/Developer/
Applications/Qt/plugins/imageformats/libqjpeg.dylib"
8 QFactoryLoader::QFactoryLoader() looking at "/Developer/
Applications/Qt/plugins/imageformats/libqmng.dylib"
9 QFactoryLoader::QFactoryLoader() looking at "/Developer/
Applications/Qt/plugins/imageformats/libqsvg.dylib"
10 QFactoryLoader::QFactoryLoader() looking at "/Developer/
Applications/Qt/plugins/imageformats/libqtiff.dylib"
11 dyld: loaded: /Developer/Applications/Qt/plugins/imageformats/
libqjpeg.dylib
12 dyld: loaded: /Library/Frameworks/QtGui.framework/Versions/4/
QtGui
13 dyld: loaded: /Library/Frameworks/QtCore.framework/Versions/4/
QtCore
14 On Mac OS X, you might be loading two sets of Qt binaries into
the same process. Check that all plugins are compiled against the
right Qt binaries. Export DYLD_PRINT_LIBRARIES=1 and check that only
one set of binaries are being loaded.
So as you can see, lines 1-4 are what I would expect, the linker is
loading the right frameworks, but then at line 5, Qt for some reasons
doesn't follow the qt.conf file and instead loads the system-installed
Qt plugins, that then, at line 12, cause to load a second copy of
QtGui, and so on.
I spent a lot of time trying to debug this, I would appreciate any
help before giving up and compiling Qt static from source :-(
thanks
marco
More information about the Qt-interest-old
mailing list