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

Alles rund um die Programmierung mit Qt
Antworten
para
Beiträge: 21
Registriert: 19. Oktober 2004 20:03

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

Beitrag 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!
Zuletzt geändert von para am 9. Februar 2007 19:16, insgesamt 4-mal geändert.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Und was für ein Problem gibt es jetzt?
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
para
Beiträge: 21
Registriert: 19. Oktober 2004 20:03

Beitrag 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".
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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?
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
para
Beiträge: 21
Registriert: 19. Oktober 2004 20:03

Beitrag 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
para
Beiträge: 21
Registriert: 19. Oktober 2004 20:03

Beitrag 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
para
Beiträge: 21
Registriert: 19. Oktober 2004 20:03

Beitrag 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
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Die config-Optionen müssen in executable und lib gleich sein - ist das auch wirklich der Fall?
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
para
Beiträge: 21
Registriert: 19. Oktober 2004 20:03

Beitrag 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
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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...
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
para
Beiträge: 21
Registriert: 19. Oktober 2004 20:03

Beitrag 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
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Langsam bin ich mit meinem Latein leider am Ende :(
Hast Du mal versucht das debug-Plugin einfach mit QLibrary() zu laden?
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
para
Beiträge: 21
Registriert: 19. Oktober 2004 20:03

Beitrag 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
para
Beiträge: 21
Registriert: 19. Oktober 2004 20:03

Beitrag 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ß
para
Beiträge: 21
Registriert: 19. Oktober 2004 20:03

Beitrag 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
Antworten