Seite 1 von 1

Library (DLL) Problem

Verfasst: 4. August 2008 18:33
von commx
Hallo Leute! =)
Ich habe da ein kleines Programm gebastelt, welches mit dazugehörigen Shared Libraries erweitert werden soll. Realisiert wird das mit QLibrary.
Funktioniert soweit alles - meine Bibliothek wird geladen und funktioniert. In der Bibliothek befindet sich eine Klasse, die musste ich aber in ein extern "C" einbetten, da der Linker sonst die Symbole der Klasse nicht gefunden hätte. Problematisch ist nun, dass ich die Signal/Slots nutzen möchte und dafür ein Q_OBJECT in meine Klassendefinition muss, dass wiederrum führt aber zu nem Linkerfehler "template on C linkage", da Q_OBJECT wohl templates verwendet und das mit C code nicht vermischbar ist.

Was kann ich da nun tun?
Anbei ein kleiner Codeausschnitt:

Code: Alles auswählen

#include <QObject>
#include <QStringList>

extern "C" {
  class ModControl : public QObject {
	Q_OBJECT
	private:
  	bool isCreated;

	public:
  	ModControl();
  	~ModControl();

	public slots:
  	void send(const QStringList &strlArgs);
  };
}
Danke!

Verfasst: 4. August 2008 19:26
von solarix
mit extern "C" wird C-Code in eine C++ Umgebung eingebettet... nicht umgekehrt!
Wenn du deiner Qt-Library also eine C-Library dazu linkst, muss du vorher die Header der C-Library in der extern "C"-Klausel einbinden:

Code: Alles auswählen

extern "C" {
#include "irgend_eine_c_lib.h"
}

void foo:baar()
{
  funktion_aus_der_c_lib();
} 
Eine gute C-Library macht das meistens selbst.. oder bietet eine spezielle Header-Datei fuer C++-Projekte an (meist mit *cpp.h gekenntzeichnet).

Verfasst: 4. August 2008 21:55
von commx
Ja, schon. Für mich klingt hier vieles auch nicht ganz logisch, aber was soll ich machen...
Ich kann das extern "C" weglassen, dann bekomme ich allerdings einen Fehler beim laden der Shared Objekt-Datei, dass er eben das Klassensymbol nicht findet. Ich möchte auch recht ungern meine Bibliotheken für das Programm in C schreiben müssen.

Verfasst: 4. August 2008 22:17
von solarix
dass er eben das Klassensymbol nicht findet
http://doc.trolltech.com/4.4/qlibrary.html#details
Wo steht da was von "Klassen"?

Verfasst: 4. August 2008 22:29
von commx
Das ist ja richtig, jedoch soll es wohl irgendwie möglich sein Klassen in den bibliotheken zu definieren und nutzen - ich hab heut den ganzen Nachmittag damit verbracht nach was brauchbarem zu googlen. Naja, wird wohl für mich nichts anderes übrig bleiben als für die Bibliotheken noch ne C-basierte signal/slot-implementation hinzuzufügen.

Verfasst: 4. August 2008 22:43
von solarix
Ich hab mir das so vorgestellt:
1. Du liest nochmals die Doku der QLibrary
2. Du entdeckst den Link ganz unten unter "see also" und folgst diesem
3. Du schaust dir die Prototypen an und siehst "QPluginLoader::instance()"
4. .... jetzt klappts bestimmt :)

Verfasst: 4. August 2008 22:50
von commx
Verdammt, wie konnte ich das übersehen... :roll:
Das ist genau das, was ich brauche. Vielen Dank!