Linker-Fehler, DLLs
-
Hallo,
ich habe ein Programm geschrieben, welches Dlls zur Laufzeit einbindet. In meinem Hauptprogramm habe ich eine Klasse erstellt, die ich als Referenz an die DLL übergeben möchte. Das Problem ist jetzt, dass die notwendige Klasse bei der Deklaration in der DLL, einen undefined reference to Fehler wirft. Die Header-Datei wurde über die Projektdatei mit INCLUDEPATH eingebunden und wenn ich eine Variable definiere, dann kann ich auch auf die Memberfunktionen der Klasse zugreifen.Danke für Eure Hilfe!!
-
Habe vergessen zu erwähnen, dass die von mir erstellte Klasse(die ich in der DLL verwenden möchte) sehr simpel ist und nur wenige Variablen enthält.
Hier die Klasse:#ifndef XXX_H #define XXX_H #include <list> class XXX { public: XXX(); ~XXX(); std::list<float *> xyz; int a; int b; int c; int d; float f; float g; }; #endif // XXX_H
-
QtNeuling schrieb:
dass die notwendige Klasse bei der Deklaration in der DLL, einen undefined reference to Fehler wirft. Die Header-Datei wurde über die Projektdatei mit INCLUDEPATH eingebunden
- Es ist lobenswert, dass du die Fehlermeldung gelesen hast, und als Fehler eine "undefined reference" erkennen konntest. Jetzt wäre interessant, was vom Linker genau nicht gefunden wurde -> Komplette Meldung posten, verrat uns gleich noch, bei welchem Teil der Fehler auftritt!
- Ein vergessener/nicht gefundener include wird dir kaum eine undefined reference auslösen
Mit ganz viel schwarzer Magie (hab dafür extra eine Scheibe mehr vom leckeren dunklen Roggenbrot gegessen) sehe ich, dass der Fehler beim Kompilieren deiner DLL auftritt. Dein Programm ist (seh ich jetzt nur verschwommen) ein einzelnes executable, in das dein "XXX" fest einkompiliert wurde.
Lösung: Alles was du außerhalb der Exe (hier in deinem Plugin) verwenden willst, solltest du in eine eigene lib packen, die dann zur exe und zur dll dazugelinkt wird.
Leider haben wir gestern abend etwas viel (hust) Exorzismus am Lagerfeuer betrieben, so dass meine Schwarzmagischen Fähigkeiten heute doch etwas schwach ausgeprägt sind
-
Hallo l'abra d'or,
danke für deine schnelle Antwort.- Es ist lobenswert, dass du die Fehlermeldung gelesen hast, und als Fehler eine "undefined reference" erkennen konntest. Jetzt wäre interessant, was vom Linker genau nicht gefunden wurde -> Komplette Meldung posten..
tmp/obj/debug_shared/myclass.o:C:\Qt\2010.04\qt\MyClass-build-desktop/../MyClass/myclass.cpp:19: undefined reference to
XXX::XXX()' tmp/obj/debug_shared/myclass.o:C:\\Qt\\2010.04\\qt\\MyClass-build-desktop/../MyClass/myclass.cpp:19: undefined reference to
XXX::~XXX()'
collect2: ld returned 1 exit status
mingw32-make[1]: *** [debug\MyClass.dll] Error 1
mingw32-make: *** [debug-all] Error 2
The Prozess "C:/Qt/2010.04/mingw/bin/mingw32-make.exe" wurde mit dem Rückgabewert %2 beendet.
Fehler beim Erstellen des Projekts MyClass (Ziel: Desktop)
Beim Ausführen des Build-Schritts 'Make'..verrat uns gleich noch, bei welchem Teil der Fehler auftritt!
Wenn ich eine Instanz der Klasse XXX erzeugen möchte.
Dein Programm ist (seh ich jetzt nur verschwommen) ein einzelnes executable, in das dein "XXX" fest einkompiliert wurde.
Hier wurdest du von deinen Kräften in die Irre geleitet. Das Programm befindet sich noch in der Entwicklung.
..solltest du in eine eigene lib packen, die dann zur exe und zur dll dazugelinkt wird.
Warum ist es nicht möglich die Header-Datei zu benutzen? Es ist nur die eine Klasse, die ich benötige.
-
QtNeuling schrieb:
Dein Programm ist (seh ich jetzt nur verschwommen) ein einzelnes executable, in das dein "XXX" fest einkompiliert wurde.
Hier wurdest du von deinen Kräften in die Irre geleitet. Das Programm befindet sich noch in der Entwicklung.
Da hast du mich aber mit deiner Aussage "ich habe ein Programm geschrieben, welches Dlls zur Laufzeit einbindet." ziemlich irritiert! Ich hab gedacht, du hast sowas wie ein Plugin geschrieben, das du zur Laufzeit laden willst, dort möchtest du deine Klasse nutzen.
Der Linkerfehler sagt mir, dass du "XXX::XXX()" und "XXX::~XXX()" nicht implementiert hast, resp. implementiert aber die .cpp wird nicht kompiliert oder das Objectfile nicht mitgelinkt (Puh :)). Trifft eines davon zu?
-
Der Linkerfehler sagt mir, dass du "XXX::XXX()" und "XXX::~XXX()" nicht implementiert hast,
Wurde implementiert
resp. implementiert aber die .cpp wird nicht kompiliert
Wie kann ich das Prüfen?
oder das Objectfile nicht mitgelinkt (Puh ).
Was meinst du damit?
Ich gehe davon aus, das mit der .cpp Datei was nicht stimmte. Aufgrund der geringen Komplexität habe ich mich entschieden, in einer Header-Datei zwei Strukturen zu implementieren. Und jetzt funktionier alles prima!
Danke für deine Hilfe l'abra d'or.
-
QtNeuling schrieb:
resp. implementiert aber die .cpp wird nicht kompiliert
Wie kann ich das Prüfen?
Der Compiler sagt normalerweise, was er gerade treibt. Da kannst du dich durchscrollen und schauen, ob du eine entsprechende Zeile "Compiling xxx.cpp" (o.Ä.) findest.
QtNeuling schrieb:
oder das Objectfile nicht mitgelinkt (Puh ).
Was meinst du damit?
Aus jeder Unit erstellt der Compiler erst ein objectfile (xxx.o, xxx.obj, ...). Pro target (eine executable oder library) werden dann die ganzen objectfiles gelinkt.
Ich gehe davon aus, das mit der .cpp Datei was nicht stimmte.
Eher mit einem Projekt- oder Makefile. Wie erstellst du die? Irgendwelche Automatismen dahinter? Vergessen "add to project/target" oder was auch immer aufzurufen?
Da es sich um Qt handelt nehm ich an du verwendest qmake: Wenn du die Datei nachträglich angelegt hast, musst du die auch im .pro unter "SOURCES" eintragen!