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:
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:
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.
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.
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