Seite 1 von 1

Qt4: QPluginLoader Probleme (bei "debug" config)..

Verfasst: 7. Februar 2007 20:49
von para
Hallo zusammen,

wie bereits einige vor mir, habe auch ich ernsthafte Probleme ein Plugin per QPluginLoader zu laden. Ich bin strikt nach dem HOWTO vorgegangen - ohne Erfolg. Ich habe extra darauf geachtet, dass sowohl die App als auch das Plugin im gleichen Modus compiled werden, aber das bringt leider nichts...

Ich hoffe ihr seht den Fehler. Leider ist Qt an dieser Stelle nicht sehr auskunftsfreudig :(

Das Interface:

Code: Alles auswählen

#include <QObject>
#include <QtPlugin>

class IPlugin
{
public:
	virtual ~IPlugin() {};
	virtual void test() const = 0;
};

Q_DECLARE_INTERFACE(IPlugin,"IPlugin/1.0")
Das Plugin:

Code: Alles auswählen

#include <QtPlugin>
#include "iplugin.h"

class Plugin : public QObject, public IPlugin
{
Q_OBJECT
Q_INTERFACES(IPlugin)
public:
	void test() const;
};

// ab hier die Implementierung

Q_EXPORT_PLUGIN2(plugin, Plugin)

void Plugin::test() const
{
	qDebug("Plugin loaded...");
}
Die Shared Libary heißt "plugin" (libplugin.so)...

Hier die .pro files:

Code: Alles auswählen

SUBDIRS += src \
plugin
TEMPLATE = subdirs 
CONFIG += warn_on \
          debug

/////////////////////////////

SOURCES += main.cpp
TEMPLATE = app
CONFIG += warn_on \
	  debug
TARGET = ../bin/app_plugin
QT -= gui

/////////////////////////////

TEMPLATE = lib
CONFIG += plugin \
warn_on \
debug
HEADERS += iplugin.h \
plugin.h
SOURCES += plugin.cpp
DESTDIR = ../bin/plugins
TARGET = plugin
Dank euch!

Verfasst: 8. Februar 2007 05:11
von Christian81
Und was für ein Problem gibt es jetzt?

Verfasst: 8. Februar 2007 07:35
von para
Sorry...

Instance() (bzw. load()) liefert immer NULL zurück und kann das Plugin irgendwie nicht laden. getErrorString() liefert lediglich ein "Unknown Error" zurück, und das Plugin findet sich danach im Plugin Cache in der Sektion "[Qt Plugin Cache 4.2.false]"...

Achja, als filename nutze ich den absoluten Pfad der Datei - unter Unix also in der Form "/<pfad>/libplugin.so".

Verfasst: 8. Februar 2007 07:39
von Christian81
Und was steht noch im PluginCache? Der BuildKey ist interessant.
In exmples/tools/ gibt es and plugandpaint example. Funktioniert das bei Dir?
Ist das Plugin evtl. von einer anderen Lib abhängig welche nicht gefunden werden kann?

Verfasst: 8. Februar 2007 08:04
von para
Plugin Cache:

Code: Alles auswählen

<pfad>/libplugin.so=40201, 1, i686 Linux g++-4 full-config, 2007-02-07T22:11:21
Was genau bedeutet die ", 1," dort? Debug Mode? Wäre ja richtig.
Das Plugin (vollst. Code findest Du oben) hat keine weiteren Abhängigkeiten und wird (s. pro files) direkt mit der Applikation compiled.

FYI, ich hab mal testweise das Q_EXPORT_PLUGIN2(plugin, Plugin) weggelassen. In diesem Fall meldete getErrorString genau einmal sowas wie "Plugin verification mismatch" (das ist logisch) danach dann nur wieder "Unknown Error". Zumindest sagt mir das, dass die Datei an sich gefunden wird. Merkwürdig ist aber auch, dass "Unknown Error" ebenfalls returned wird, wenn man eine nicht-existierende Datei angibt...

para

Verfasst: 8. Februar 2007 17:53
von para
Nachtrag: examples/tools/plugandpaint und examples/tools/plugandpaintplugins kompilieren beide (wie mein Projekt) sauber durch. Beim Start von plugandpaint erscheinen sowohl die statischen wie auch die dynamischen Plugins. Am Build-System kann es daher nicht wirklich liegen...

para

Verfasst: 8. Februar 2007 19:02
von para
Teilweise Lösung: solange ich keine zusätzlichen CONFIG Schalter angebe, funktioniert es...

Code: Alles auswählen

plugin.pro:

TEMPLATE = lib
CONFIG += plugin
HEADERS += plugin.h
SOURCES += plugin.cpp
DESTDIR = ../bin/plugins
TARGET = plugin


src.pro:

HEADERS += iplugin.h
SOURCES += main.cpp
TEMPLATE = app
TARGET = ../bin/app_plugin
QT -= gui
Ich frage mich jetzt nur, wie ich nun meine Anwendung vernünftig debuggen soll :roll:

Ideen?

Gruß,
para

Verfasst: 8. Februar 2007 20:01
von Christian81
Die config-Optionen müssen in executable und lib gleich sein - ist das auch wirklich der Fall?

Verfasst: 9. Februar 2007 00:32
von para
1.) Erstmal danke für deine Hilfe
2.) Das ist mir bekannt. Daher füge ich nur mal "debug" hinzu:

Code: Alles auswählen

plugin.pro: 
 
TEMPLATE = lib
CONFIG += plugin \
          debug
HEADERS += plugin.h
SOURCES += plugin.cpp
DESTDIR = ../bin/plugins
TARGET = plugin
 
 
src.pro: 
 
HEADERS += iplugin.h
SOURCES += main.cpp
CONFIG += debug
TEMPLATE = app
TARGET = ../bin/app_plugin
QT -= gui
Wie Du siehst, hat sich sonst nichts verändert (Code natürlich identisch). Nun bekomme ich wieder NULL zurück und die "Unkown Error" Meldung per errorString() :?

Tausche ich "debug" gegen "release" aus, geht es wieder. Release scheint also implizit als auch explizit zu funktionieren...

para

Verfasst: 9. Februar 2007 06:28
von Christian81
Hast Du danach den Plugincache gelöscht? Imo schaut Qt erst dort nach bevor ein Laden der Library versucht wird. Und wenn dort noch das alte steht...

Verfasst: 9. Februar 2007 07:53
von para
Das dürfte egal sein, da Plugin und App neu kompiliert werden und somit einen neuen Timestamp tragen... Ich versuch's aber gerne mal...

Nachtrag: wie erwartet keine Änderung

Verfasst: 9. Februar 2007 08:27
von Christian81
Langsam bin ich mit meinem Latein leider am Ende :(
Hast Du mal versucht das debug-Plugin einfach mit QLibrary() zu laden?

Verfasst: 9. Februar 2007 10:14
von para
Noch nicht, aber auch das werde ich probieren. Vor allem werde ich mal versuchen, dass plugandpaint Beispiel mit "debug" zu erstellen. Später mehr...

para

Verfasst: 9. Februar 2007 17:37
von para
So, QLibrary habe ich jetzt nicht extra probiert, aber das plugandpaint Beispiel verhält sich genauso wie mein eigenes Plugin: sobald ich den "debug" Schalter zur CONFIG hinzufüge, wird das dynamische (!) Plugin nicht mehr geladen - das statische hingegen schon...

Es scheint also mehr ein generelles Problem als ein spezifisches meines Plugins zu sein. Sagt dir das irgendwas? Zur Info: ich nutze Debian (etch) und Qt 4.2.1.

Gruß

Verfasst: 14. Februar 2007 00:02
von para
Alsooooo, das ganze scheint ein Bug zu sein:
http://www.trolltech.com/developer/task ... &id=133954

Da kann man(n) natürlich lange suchen :?

Noch ein Tipp: Qt wird standardmäßig mit "debug_and_release" kompiliert (zumindest bei Debian). Ihr solltet also eure Apps und Plugins ebenfalls mit diesem Schalter (und ggf. noch "build_all") übersetzen! Nutzt dazu z.B. folgenden Zusatz, damit die Debug- und Release-Versionen auch in getrennten Dateien bzw. Ordnern landen:

Code: Alles auswählen

CONFIG(debug, debug|release){
    unix: TARGET = $$join(TARGET,,,_debug)
    else: TARGET = $$join(TARGET,,d)
}

Code: Alles auswählen

CONFIG(debug, debug|release) {
        DESTDIR = debug
} else {
        DESTDIR = release
}
Gruß,
para