Library (DLL) Problem

Alles rund um die Programmierung mit Qt
Antworten
commx
Beiträge: 7
Registriert: 4. August 2008 16:28

Library (DLL) Problem

Beitrag 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!
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag 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).
commx
Beiträge: 7
Registriert: 4. August 2008 16:28

Beitrag 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.
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

dass er eben das Klassensymbol nicht findet
http://doc.trolltech.com/4.4/qlibrary.html#details
Wo steht da was von "Klassen"?
commx
Beiträge: 7
Registriert: 4. August 2008 16:28

Beitrag 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.
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag 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 :)
commx
Beiträge: 7
Registriert: 4. August 2008 16:28

Beitrag von commx »

Verdammt, wie konnte ich das übersehen... :roll:
Das ist genau das, was ich brauche. Vielen Dank!
Antworten