LinkerFehler nach Einbinden von QtXml

Alles rund um die Programmierung mit Qt
Antworten
jk
Beiträge: 9
Registriert: 21. August 2007 14:01

LinkerFehler nach Einbinden von QtXml

Beitrag von jk »

Hallo
Ich versuche seit etlicher Zeit (ca. 2h) ein QDomDocument zu erstellen.
Env: Linux Suse 10.2, kdevelop 3.41 Qt 4.3.0 OS

Ich habe folgendes gemacht:
in .pro Datei
QT += xml

in .h Datei
#include <QtXml/QtXml>

aber kriege keinen Compilerlauf fertig da er meldet:
main.cpp:(.text+0x48): undefined reference to QDomDocument::QDomDocument()'

Was fehlt mir?
Kann es sein, dass der XML-Teil von Qt4 von mir nicht mit erstellt wurde und er so zwar die includes findet aber in den libs nx zum verlinken?[/list][/quote]
Jeden Morgen steht ein Dummer auf,
nur warum immer ich?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

qmake nach ändern der pro-Datei nicht aufgerufen?
Ausserdem muss es nicht unbedingt <QtXml/QtXml> sein, ein <QtXml> reicht wenn Du es korrekt in die pro-Datei eingtragen hast.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
jk
Beiträge: 9
Registriert: 21. August 2007 14:01

Linker Fehler besteht weiter

Beitrag von jk »

sowohl per kdevelop als auch manuell im Projektverz aufgerufen

make distclean <ENTER>
qmake

Resultat:
niente nix immer noch der gleiche Fehler.
Inzwischen versuche ich nur noch in der main eine Instanz der Klasse
QDomDocument zu erstellen mit folgender zeile

QDomDocument doc1;

Die Antwort lautet:

main.cpp:(.text+0x48): undefined reference to `QDomDocument::QDomDocument()'
Jeden Morgen steht ein Dummer auf,
nur warum immer ich?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Ist in der Linker-Zeile auch QtXml zu sehen oder nicht? Einige Demos verwenden auch QtXML - lassen die sich kompilieren?
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
jk
Beiträge: 9
Registriert: 21. August 2007 14:01

Linker-Fehler lässt sich verallgemeinern

Beitrag von jk »

habe eben gerade noch einmal was anderes versucht.

in .pro
QT += network

dann
make distclean und qmake

in (jetzt nur noch!) main.cpp

QHttpRequestHeader h1;

Resultat:

main.cpp:(.text+0x48): undefined reference to `QHttpRequestHeader::QHttpRequestHeader()'


ergo:
Beim Einbinden aller Module außer QtGui streikt der Linker.
Muss man evtl. noch Compiler resp. Linker-Flags setzen?
Da war mal was , aber ich komm geistig nicht ran.
Jeden Morgen steht ein Dummer auf,
nur warum immer ich?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Wie gesagt - ich kann mir nur vorstellen das qmake nicht das richtige pro-File parst und/oder QT += xml nicht interpretiert wird (auskommentiert, ...). Die examples funktionieren alle bei mir - solltest du auch mal testen.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
jk
Beiträge: 9
Registriert: 21. August 2007 14:01

Test des Linkers mit Examples : Results

Beitrag von jk »

habe eben gerade das RSS-Example ausprobieren wollen(!!)
gleicher Fehler

Linken der Datei rsstest (g++)
rsslisting.o: In function `RSSListing::parseXml()':
rsslisting.cpp:(.text+0x86): undefined reference to `QXmlStreamReader::atEnd() const'
und viele andere mehr

Bei mir spinnt der Linker total.
Ich versuchte es dann pur auf der Konsole
der gleiche Mist:
Er erstellt die .o files und kann dann mit den neuen libs nicht verlinken

Es ist bestimmt nur ein My, das fehlt aber welches?
Jeden Morgen steht ein Dummer auf,
nur warum immer ich?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Zum zweiten Mal - was für Libs werden dem Linker übergeben? Sind dort die Qt-Libs mit dabei oder nicht?
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
jk
Beiträge: 9
Registriert: 21. August 2007 14:01

Libs übergeben?

Beitrag von jk »

Ich habe im Anhang mal die results des manuellen laufes in eine Datei gepackt.
Muss jetzt aber erst mal 140 km fahren und melde mich dann von zuhause,
Erst mal vielen Dank für die schnellen Antworten
Dateianhänge
linker_fehler.txt
(3.95 KiB) 219-mal heruntergeladen
Jeden Morgen steht ein Dummer auf,
nur warum immer ich?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Code: Alles auswählen

g++ -Wl,-rpath,/usr/local/Trolltech/Qt-4.3.0/lib -o src main.o rsslisting.o moc_rsslisting.o    -L/usr/local/Trolltech/Qt-4.3.0/lib -lQtXml -L/usr/local/Trolltech/Qt-4.3.0/lib -pthread -L/opt/gnome/lib -pthread -lQtGui -L/usr/X11R6/lib -lpng -lSM -lICE -pthread -pthread -lXi -lXrender -lXrandr -lXfixes -lXcursor -lXinerama -lfreetype -lfontconfig -lXext -lX11 -lQtCore -lz -lm -pthread -lgthread-2.0 -lglib-2.0 -lrt -ldl -lpthread

Da ist kein QtNetwork mit dabei. Dafür aber QtXml - so wie ich das sehe hat qmake das Makefile nicht neu erstellt als Du Qt+= xml eingefügt hast denn jetzt ist XML ja dabei...
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
jk
Beiträge: 9
Registriert: 21. August 2007 14:01

gegen LinkerFehler - Qt4-Rebuild ist angesagt

Beitrag von jk »

Danke Christian,
bin jetzt zuhause am rel. jungfräulichen System
Suse 10.2 kdevelop 3.41 und Qt4.3.0

Ich vermute, dass der Fehler auftritt, weil Qt4 nicht mit den richtigen Optionen compiliert wurde, so dass z.B. XML und Network zwar als .h zum includen da sind, aber nicht als compilierte libs zum Linken.
ich werde heute und morgen mal einen tieferen Exkrus in das setup von Qt4 machen und herausfinden, wozu welche option beim configure ist und wie ich die XML und Network libs ansprechen kann.
Als Ex-Windows-User hatte ich angenommen, dass erst mal pro forma alles installiert wird und ich sagen muss, wass ich nicht will.
Es scheint aber anders zu sein. Ich muss wohl einige libs explizit einbinden.
Mal sehen.
Dir , Christian, erstmal vielen Dank.
Ich melde mich hier mit Ergebnissen oder weiteren Fragen.

MfG
Jens
Jeden Morgen steht ein Dummer auf,
nur warum immer ich?
jk
Beiträge: 9
Registriert: 21. August 2007 14:01

Lösung des Problems

Beitrag von jk »

Hi Christian und alle anderen!

Das Problem hat sich wie folgt geklärt:
Unter Windows: nicht reproduzierbar.
Unter linux: Problem liegt bei kdevelop.

Temporäre (!!) Lösung:
1. Eintragen von QT += xml oder QT += network in die .pro-Datei.
2. kdevelop beenden.
3. kdevelop neustarten
4. Es lööft.

Ich habe keine Ahnung, warum oder weshalb es hier eines Neustarts von kdevelop bedarf, aber es war sowohl bei der Einbindung von network als auch bei der Einbindung von xml reproduzierbar, dass so die undefined references auf einmal defined waren und alles lief.

Vielen Dank für alle Kommentare und Hilfen.
Jeden Morgen steht ein Dummer auf,
nur warum immer ich?
apaku
Beiträge: 4
Registriert: 21. Mai 2007 20:55

Re: Lösung des Problems

Beitrag von apaku »

jk hat geschrieben:Hi Christian und alle anderen!

Das Problem hat sich wie folgt geklärt:
Unter Windows: nicht reproduzierbar.
Unter linux: Problem liegt bei kdevelop.

Temporäre (!!) Lösung:
1. Eintragen von QT += xml oder QT += network in die .pro-Datei.
2. kdevelop beenden.
3. kdevelop neustarten
4. Es lööft.

Ich habe keine Ahnung, warum oder weshalb es hier eines Neustarts von kdevelop bedarf, aber es war sowohl bei der Einbindung von network als auch bei der Einbindung von xml reproduzierbar, dass so die undefined references auf einmal defined waren und alles lief.
Das KDevelop die Ursache ist wuerde ich zunaechst Mal bestreiten wollen. Denn in den bisherigen Posts war nie die Rede davon, dass du in KDevelop im QMake Manager (bzw. in dessen Project Options Dialog) das Xml-Haeckchen gesetzt hast oder das du das ganze aus KDevelop heraus gemacht hast. Das Problem trat also (schliessend aus den bisherigen Postings) auch mit qmake/make auf der Kommandozeile auf, was eindeutig beweist das das Problem nicht bei KDevelop liegt.

Das KDevelop beenden und neu starten nach der Aenderung in der .pro Datei notwendig ist bezweifle ich ebenfalls. Ein Neuladen des Projektes sollte reichen. Warum das als Workaround funktioniert kann ich so nicht nachvollziehen, was KDevelop beim beended/Projekt schliessen macht ist nichts weiter als die im Speicher befindlichen geparsten .pro Dateien auf Platte rauszuschreiben und dann die .kdevelop Datei.

Schlussendlich: Wenn du die .pro Files manuell bearbeiten willst wuerde ich dir empfehlen nicht den QMake Manager sondern ein "Custom Makefile" Projekt in KDevelop zu benutzen. Der QMake Manager kontrolliert zwar die .pro Dateien auf externe Aenderungen, aber ich habe auch selbst schon feststellen muessen das das manchmal nicht ganz funktioniert (weil die KDirWatch Klasse von KDE ein paar Macken hat). Umstellen kannst du dein Projekt ganz einfach indem du mit nem Editor in der .kdevelop Datei den Inhalt des Elements "projectmanagement" von KDevTrollProject auf KDevCustomProject aenderst.
jk
Beiträge: 9
Registriert: 21. August 2007 14:01

Re: Kdevelop wars wohl

Beitrag von jk »

Hi apaku,
ich werde morgen das Ganze noch einmal einem Test unterziehen. So ganz entbehren Deine Ausführungen der Logik nämlich nicht.
Ich hatte auch Probleme damit, das Ganze als Lösung zu betrachten und habe es der Einfachheit halber als Workaround benannt.
Ich werde einmal das Wechselspiel der lokalen .pro und der .pro-Datei im src-Ordner der kdevelop Datei untersuchen. kdevelop 3.4.1 raucht dabei zwar gerne ab aber das macht erst mal nix. Das Eintragen von "QT+=xml" in der .pro-Datei im Projektordner scheint aber echt nix zu bewirken.
ALs es lief hatte ich baer im letzten Moment vor dem Abrauchen von kdevelop noch in der src.pro die bewusste Zeile eingefügt. Kann sein, dass da der Unterschied liegt.
Wie gesagt, morgen ist Probetag mit frischen Testprojekten.
Vielleicht war ich zu voreilig beim Posten, Sorry.
Dank Dir für Dein Posting, ich war nur 3 Tage wegen akuter Kindererziehungsprobleme verhindert. Ich melde mich.
Gruß
jens
Jeden Morgen steht ein Dummer auf,
nur warum immer ich?
Antworten