iOS: Remove need for -force_load of platform plugin

Instead of force-loading the whole static library of the platform plugin
we tell the linker to look for the missing symbol qt_registerPlatformPlugin.
This symbol is provided by the same object file as the plugin's static
initializer, so the object file is included in the final binary and
the static initializer is run, resulting in the plugin registering with
Qt.

We could have marked the actual static initializer wrapper provided by
Q_IMPORT_PLUGIN(QIOSIntegrationPlugin) as undefined, but due to the C++
mangling this would look less intuitive on the linker command line than
the custom dummy function that we provide, which has C linkage.

Change-Id: I6805537e1f49260a41d48c555376964cb1fe75d8
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@digia.com>
Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@digia.com>
This commit is contained in:
Tor Arne Vestbø 2013-06-06 13:26:42 +02:00 committed by The Qt Project
parent ba1aefa85d
commit e99fc91c58
2 changed files with 18 additions and 10 deletions

View File

@ -11,17 +11,21 @@ isEmpty(MAKEFILE_GENERATOR) {
}
gui_app {
# We have to do the link and dependency resolution for the platform plugin
# manually, since QTPLUGIN and the prl lookup logic does not support
# the -force_load link style. The -force_load option ensures that all
# symbols from the static library are included, not just the ones the
# linker have seen a use for so far. We need this because we load the platform
# plugin from the platform plugin itself, using Q_IMPORT_PLUGIN.
lib_path_and_base = $$[QT_INSTALL_PLUGINS/get]/platforms/libqios$$qtPlatformTargetSuffix()
LIBS += -Wl,-force_load,$${lib_path_and_base}.$${QMAKE_EXTENSION_STATICLIB}
LIBS += $$fromfile($${lib_path_and_base}.prl, QMAKE_PRL_LIBS)
LIBS *= -L$$[QT_INSTALL_PLUGINS/get]/platforms
# Which means we don't want the auto-generated import for the platform plugin
lib_name = qios
lib_path_and_base = $$[QT_INSTALL_PLUGINS/get]/platforms/lib$${lib_name}$$qtPlatformTargetSuffix()
LIBS += -l$${lib_name}$$qtPlatformTargetSuffix() $$fromfile($${lib_path_and_base}.prl, QMAKE_PRL_LIBS)
# By marking qt_registerPlatformPlugin as undefined, we ensure that
# the plugin.o translation unit is considered for inclusion in
# the final binary, which in turn ensures that the plugin's
# static initializer is included and run.
QMAKE_LFLAGS += -u _qt_registerPlatformPlugin
# We do link and dependency resolution for the platform plugin
# manually, since we know we always need the plugin, so we don't
# need to generate an import for it.
CONFIG -= import_qpa_plugin
!no_main_wrapper {

View File

@ -66,4 +66,8 @@ QT_END_NAMESPACE
#include "plugin.moc"
// Dummy function that we explicitly tell the linker to look for,
// so that the plugin's static initializer is included and run.
extern "C" void qt_registerPlatformPlugin() {}
Q_IMPORT_PLUGIN(QIOSIntegrationPlugin)