Hallo,
ich habe ein QT-Projekt gestartet, das mittlerweile ziemlich umfangreich (also für meine Verhältnisse) geworden ist, und ich habe eigentlich erst angefangen.
Ich habe mich anhand dieses Projektes in die C++ Programmierung und in QT eingearbeitet (oder sollte ich besser sagen an der Oberfläche gekratzt), vielleicht ein bißchen viel auf einmal, und da sind eben ein paar
Wissenslücken vorhanden, wie in nun folgender Situation:
Bisher habe ich alle meine Sourcen (x.cpp) in main.cpp includiert.
Wenn man mich jetzt fragt weshalb, dann kann ich nur sagen, daß es ein Weg war der bisher funktioniert hat, ich habe ihn eingeschlagen und nicht weiter darüber nachgedacht. Aber er hat den Nachteil, daß nur ein einziges Objektfile (neben den moc_xx.o-Files) erzeugt wird, was bedeutet, daß egal wo ich etwas ändere,es muß immer alles neu compiliert werden, was mittlerweile unangenehm lange dauert.
Ich arbeite unter SuSE Linux 9.0 mit QT 3.2
Ich habe also versucht, das Projekt so zu "entflechten" (sorry für den Ausdruck), daß ich die #include "xx.cpp" aus main.cpp herausgenommen
und das Projektfile xy.pro bei SOURCES += xx.cpp eingetragen habe.
Bisher stand da bei SOURCES += main.cpp, jetzt alle xx.cpp.
Ich erzeuge mit qmake xy.pro -o Makefile das Makefile und compiliere mit make. Die Objektdateien werden alle angelegt, nach meinem dafürhalten
ohne Fehler, auch das moc_xx.o-file ist da.
Allerdings beim linken bekomme ich ca. 5 Bildschirmseiten Fehlermeldungen, alle derselben couleur, hier ein Auszug:
g++ -o cad_parser cad_parser_main.o cad_parser_hauptfenster.o hauptfenster_slot_sprachauswahl.o hauptfenster_slots_menue_datei.o hauptfenster_slots_bestueckliste.o cad_parser_gehaeuseform.o cad_parser_gf_erzeugen.o cad_parser_gf_liste.o cad_parser_bauelement.o cad_parser_be_liste.o cad_parser_bestueckposition.o cad_parser_bestueckposition_beinchen_liste.o cad_parser_bestueckposition_ball_liste.o cad_parser_dialog_bitmap_bearbeiten.o cad_parser_grafik_funktionen.o cad_parser_datei_dialog.o cad_parser_hauptfenster_mouse_event.o moc_cad_parser_hauptfenster.o -L/usr/lib/ -L/usr/lib/qt3/lib/ -L/usr/X11R6/lib/ -lqt -lXext -lX11 -lm
cad_parser_hauptfenster.o(.text+0xe80): In function `hauptfenster::hauptfenster[not-in-charge](QWidget*, char const*, unsigned, int)':
/usr/lib/qt3/include/qstring.h:1049: undefined reference to `gehaeuseform::getGf_name()'
cad_parser_hauptfenster.o(.text+0x11d8):/usr/lib/qt3/include/qstring.h:1049: undefined reference to `bauelement::getBe_name()'
cad_parser_hauptfenster.o(.text+0x6140): In function `hauptfenster::hauptfenster[in-charge](QWidget*, char const*, unsigned, int)':
/usr/lib/qt3/include/qstring.h:1049: undefined reference to `gehaeuseform::getGf_name()'
cad_parser_hauptfenster.o(.text+0x6498):/usr/lib/qt3/include/qstring.h:1049: undefined reference to `bauelement::getBe_name()'
hauptfenster_slots_bestueckliste.o(.text+0x21c): In function `hauptfenster::bestueckliste_slot_zeile_einfuegen()':
/home/christoph/C++qt/CAD-Parser/hauptfenster_slots_bestueckliste.cpp:120: undefined reference to `bestueckposition::getStatus()'
hauptfenster_slots_bestueckliste.o(.text+0x71a):/home/christoph/C++qt/CAD-Parser/hauptfenster_slots_bestueckliste.cpp:183: undefined reference to `bestueckposition::setKoordinate_x(double)'
hauptfenster_slots_bestueckliste.o(.text+0x736):/home/christoph/C++qt/CAD-Parser/hauptfenster_slots_bestueckliste.cpp:184: undefined reference to `bestueckposition::setKoordinate_y(double)'
hauptfenster_slots_bestueckliste.o(.text+0x8c4): In function `hauptfenster::bestueckliste_zeile_einfuegen(int, int)':
/home/christoph/C++qt/CAD-Parser/hauptfenster_slots_bestueckliste.cpp:222: undefined reference to `bestueckposition::getEinbauplatz()'
hauptfenster_slots_bestueckliste.o(.text+0x935):/home/christoph/C++qt/CAD-Parser/hauptfenster_slots_bestueckliste.cpp:225: undefined reference to `bestueckposition::getBauelement_name()'
und so weiter und so weiter.
Ich habe die betreffende Projekt-Datei angehängt, vielleicht ist der Fehler
ja dort zu suchen.
Ich denke es kann nur eine Kleinigkeit sein, der Ochse vor dem Berg sozusagen.
Vielen Dank für jede Hilfe
Grüße
Christoph
[gelöst] Problem mit dem Linker
-
FlorianBecker
- Beiträge: 1213
- Registriert: 2. Dezember 2004 10:54
- Kontaktdaten:
Also deine pro Datei fehlt.
Aber egal, dein Problem:
gehaeuseform::getGf_name()
usw. das sind alles Funktionen die nicht mit in dem Projekt aufgenommen sind. Wenn diese Funktionen nicht vorhanden sind, sondern nur definiert sind kommt dieser Fehler, oder wenn du die Object Datei nicht mit in dein Projekt linkst.
Aber egal, dein Problem:
gehaeuseform::getGf_name()
usw. das sind alles Funktionen die nicht mit in dem Projekt aufgenommen sind. Wenn diese Funktionen nicht vorhanden sind, sondern nur definiert sind kommt dieser Fehler, oder wenn du die Object Datei nicht mit in dein Projekt linkst.
Projekt Datei
Hallo Florian,
vielen Dank für Deine schnelle Antwort, ich habe das Projektfile
vergessen hinzuzufügen, und liefere das jetzt nach.
Wenn das so ist, wie du schreibst, wie kann ich die fehlenden Dateien dann dazulinken ? Ich habe sowas noch nie gemacht.
Gibt die Projektdatei hierüber Aufschluß ?
Grüße nach Kümmersbruck ans Grammerbergl
Christoph
vielen Dank für Deine schnelle Antwort, ich habe das Projektfile
vergessen hinzuzufügen, und liefere das jetzt nach.
Wenn das so ist, wie du schreibst, wie kann ich die fehlenden Dateien dann dazulinken ? Ich habe sowas noch nie gemacht.
Gibt die Projektdatei hierüber Aufschluß ?
Grüße nach Kümmersbruck ans Grammerbergl
Christoph
- Dateianhänge
-
- cad_parser.zip
- Projekt-Datei
- (408 Bytes) 247-mal heruntergeladen
-
FlorianBecker
- Beiträge: 1213
- Registriert: 2. Dezember 2004 10:54
- Kontaktdaten:
Mh, also die Projektdatei hilft nicht wirklich viel. Aber so wie es aussieht, linkst du bereits alles.
Also direkt sichtbare Möglichkeiten für eine Lösung:
Baue das vollständige Projekt nochmal, vielleicht sind es ältere Objectdateien, die er linken will und da fehlen eben diese Funktionen.
Es fehlen die Funktionen, da Sie nur definiert sind. Hast du denn gar keine Moc Dateien? Es scheint, als ob nur deine Slots undefinied sind, könnte also auch sein, dass da irgendwas schief läuft.
Das Problem ist, man muss hier schon die Gesamtheit des Projektes sehen.
Schicke mir die Dateien bitte mal zu, wenn du das kannst. Meine eMail Adresse ist mein nachname_at_plaasoft.de, vielleicht kann ich dir damit irgendwie besser helfen. Du benutzt halt auch nicht gerade die beste Möglichkeit der Dateitrennung. Pro Klasse eine Datei, eine Klasse ist entweder ein Widget, oder eine Klasse die eine bestimmte Aufgabe löst. Ist als Übersicht viel einfacher als sogar Slots zu trennen.
Also direkt sichtbare Möglichkeiten für eine Lösung:
Baue das vollständige Projekt nochmal, vielleicht sind es ältere Objectdateien, die er linken will und da fehlen eben diese Funktionen.
Es fehlen die Funktionen, da Sie nur definiert sind. Hast du denn gar keine Moc Dateien? Es scheint, als ob nur deine Slots undefinied sind, könnte also auch sein, dass da irgendwas schief läuft.
Das Problem ist, man muss hier schon die Gesamtheit des Projektes sehen.
Schicke mir die Dateien bitte mal zu, wenn du das kannst. Meine eMail Adresse ist mein nachname_at_plaasoft.de, vielleicht kann ich dir damit irgendwie besser helfen. Du benutzt halt auch nicht gerade die beste Möglichkeit der Dateitrennung. Pro Klasse eine Datei, eine Klasse ist entweder ein Widget, oder eine Klasse die eine bestimmte Aufgabe löst. Ist als Übersicht viel einfacher als sogar Slots zu trennen.
Problem mit dem Linker: Die Lösung
Die Lösung für das Problem ist wie folgt:
Ich hatte in sehr vielen meiner Funktionen in den headerfiles classname.h deklariert mit:
typ funktions_name();
und dann in den sourcefiles classname.cpp mit
inline typ classname::funktionsname() {}
implementiert.
Ich habe das inline vor geraumer Zeit in viele Funktionen eingefügt, weil ich Performance-Probleme hatte und die Hoffnung,
daß dies einen Beitrag zu deren Lösung leisten kann, das war aber leider nicht so (die Ursache lag auch woanders, wie ich später herausgefunden habe).
Ich habe die ganzen inlines aber drin gelassen, das hat ja bis jetzt auch nicht weiter gestört.
Ich habe nun die ganzen inlines wieder entfernt und dann hat es funktioniert.
Ich hatte in sehr vielen meiner Funktionen in den headerfiles classname.h deklariert mit:
typ funktions_name();
und dann in den sourcefiles classname.cpp mit
inline typ classname::funktionsname() {}
implementiert.
Ich habe das inline vor geraumer Zeit in viele Funktionen eingefügt, weil ich Performance-Probleme hatte und die Hoffnung,
daß dies einen Beitrag zu deren Lösung leisten kann, das war aber leider nicht so (die Ursache lag auch woanders, wie ich später herausgefunden habe).
Ich habe die ganzen inlines aber drin gelassen, das hat ja bis jetzt auch nicht weiter gestört.
Ich habe nun die ganzen inlines wieder entfernt und dann hat es funktioniert.