libxml++2.6 Headerpfade werden nicht richtig erkannt
-
In einem Programm will ich libxml++2.6 verwenden. Beim Installieren des Pakets werden (unter Debian via apt-get install) die Header unter
/usr/include/libxml++-2.6/libxml++/
angelegt.
Dort befindet sich auch der "Hauptheader" welcher via
#include <libxml++-2.6/libxml++/libxml++.h>
ins Projekt eingebunden wurde.
Ich will das Programm kompilieren und bekomme allerdings eine ganze Reihe von Fehler dieser Art:/usr/include/libxml++-2.6/libxml++.h:10:48: libxml++/exceptions/internal_error.h: Datei oder Verzeichnis nicht gefunden /usr/include/libxml++-2.6/libxml++.h:11:45: libxml++/exceptions/parse_error.h: Datei oder Verzeichnis nicht gefunden (und so weiter)
Also schaue ich mir den besagten Header libxml++.h mal an und sehe dort folgendes:
#include <libxml++/exceptions/internal_error.h> #include <libxml++/exceptions/parse_error.h> #include <libxml++/parsers/domparser.h> #include <libxml++/parsers/saxparser.h> #include <libxml++/nodes/node.h>
Obwohl die Datei libxml++.h schon in einem Unterverzeichnis von libxml++ liegt, wird aus ihr heraus wiederum auf eben dieses Unterverzeichnis verwiesen. Also wundern mich die Meldungen nicht weiter und ich erstelle eine Kopie von libxml++.h und lege sie ab in
/usr/include/libxml++-2.6
, also eine Hierarchiestufe über libxml++, jetzt sollten die Verweise im Header auf die richtigen Daten Zeigen. Ebenso passe ich den include- Befehl im Programm an:
<libxml++-2.6/libxml++.h>
Ich kompiliere das Projekt erneut und wat is....
/usr/include/libxml++-2.6/libxml++.h:10:48: libxml++/exceptions/internal_error.h: Datei oder Verzeichnis nicht gefunden /usr/include/libxml++-2.6/libxml++.h:11:45: libxml++/exceptions/parse_error.h: Datei oder Verzeichnis nicht gefunden /usr/include/libxml++-2.6/libxml++.h:12:40: libxml++/parsers/domparser.h: Datei oder Verzeichnis nicht gefunden /usr/include/libxml++-2.6/libxml++.h:13:40: libxml++/parsers/saxparser.h: Datei oder Verzeichnis nicht gefunden /usr/include/libxml++-2.6/libxml++.h:14:33: libxml++/nodes/node.h: Datei oder Verzeichnis nicht gefunden
Ergebnis: Ich bin Ratlos und der Kram funktioniert nicht
. Weiss jemand von Euch, was da schief läuft?
-
Das hat so wie es ist schon seine Richtigkeit.
Normalerweise liegt /usr/include nämlich im Includepath und dann wird <foo/bar/baz.h> auf alle Fälle immer richtig aufgelöst.
Überprüfe mal den Includepath, bzw ob es diese Dateien auch wirklich an diesem Ort gibt.
-
Die Dateien liegen dort- steht doch auch im Text.
-
Physikalischer Fehler schrieb:
Die Dateien liegen dort- steht doch auch im Text.
Tatsächlich? Wo denn?
Ich verstehe das Problem aber nach wie vor nicht; Du musst einfach das libxml++-Verzeichnis in Deinen Includepath tun; dann passt alles.
Wild Dateien herumkopieren ist meistens keine gute Idee.
-
Schau dir die -I Option des GCCs an: -I/usr/local/include/libxml++-2.6
Ansonsten hilft dir vielleicht pkgconfig.
-
Also: die Dateien liegen unter
/usr/include
- das ist doch das Standard Include Verzeichnis, oder etwa nicht?
Unter dem obenstehenden Pfad wurde beim Installieren das Verzeichnis libxml++-2.6 angelegt, welches ein Unterverzeichnis Namens libxml++ beinhaltet, in dem sich dann wiederum die Datei libxml++.h befindet.
Normalerweise müsste ich in der Quellcodedatei
#include <libxml++-2.6/libxml++/libxml.h>
angeben, damit der Header gefunden wird (nach diesem Schema funktioniert es mit anderen externen Headern wie z.B. curl, den ich via
#include <curl/curl.h>
einbinde hervorragend, die File curl.h befindet sich z.B. auch unter
usr/include/curl/curl.h
.
Trotzdem gibt es leider den oben beschriebenen Fehler (bei libxml, nicht bei curl).
-
Ich versteh es echt nicht mehr!
Die Datei libxml++.h sowie das dazugehörige Verzeichnis libxml++ mitsamt seinem Inhalt und Unterordnern wurden in das gleiche Verzeichnis kopiert, wie die zu kompilierende Quellcodedatei.per "#include libxml++.h" wurde bzw. soll sie eingebunden werden. Als ich es auf die geleiche Weise im KDevelop versucht hatte, hat es funktioniert. Mache ich es von Hand im g++:
libxml++.h:10:48: libxml++/exceptions/internal_error.h: Datei oder Verzeichnis nicht gefunden
libxml++.h:11:45: libxml++/exceptions/parse_error.h: Datei oder Verzeichnis nicht gefunden
libxml++.h:12:40: libxml++/parsers/domparser.h: Datei oder Verzeichnis nicht gefunden
libxml++.h:13:40: libxml++/parsers/saxparser.h: Datei oder Verzeichnis nicht gefunden
libxml++.h:14:33: libxml++/nodes/node.h: Datei oder Verzeichnis nicht gefunden
libxml++.h:15:40: libxml++/nodes/commentnode.h: Datei oder Verzeichnis nicht gefunden
libxml++.h:16:36: libxml++/nodes/element.h: Datei oder Verzeichnis nicht gefunden
libxml++.h:17:44: libxml++/nodes/entityreference.h: Datei oder Verzeichnis nicht gefunden
libxml++.h:18:37: libxml++/nodes/textnode.h: Datei oder Verzeichnis nicht gefunden
libxml++.h:19:32: libxml++/attribute.h: Datei oder Verzeichnis nicht gefunden
libxml++.h:20:31: libxml++/document.h: Datei oder Verzeichnis nicht gefundenDas Verzeichis IST vorhzanden. Ich kann es sehen, ansteuern, kopieren, was weiss ich, nur der Compiler findet es nicht...
-
Ja, aber da in /usr/include/libxml++-2.6/libxml++/libxml++.h Sachen stehen wie
#include <libxml++/exceptions/internal_error.h> #include <libxml++/exceptions/parse_error.h> #include <libxml++/parsers/domparser.h> #include <libxml++/parsers/saxparser.h> #include <libxml++/nodes/node.h>
...musst du halt /usr/include/libxml++-2.6/ in deinen Include Path tun. Danach kannst du auch die libxml++.h einfacher mit
#include <libxml++/libxml++.h>
einbinden
Also einfach bei gcc die Option angeben, die kingruedi gesagt hat.
-
Sorry, nicht genau dieselbe Option, bei dir ist das ja nicht in /usr/local... versuch -I/usr/include/libxml++-2.6
-
Danke, es hat funktioniert!
-
Es ist schaurig!!!!!
Schon wieder der gleiche Mist!
Im Programm steht:
#include <libxml++/libxml++.h>
g++ wird mitttels
-I/usr/include/libxml++-1.0
mitgeteilt, wo es sich die Sachen zu holen hat (das hat wirklich schonmal funktioniert) und jetzt schon wieder das:
finaldelta.cpp:38:29: libxml/libxml++.h: Datei oder Verzeichnis nicht gefunden
finaldelta.cpp:82: error: Fehler beim Parsen before::' token finaldelta.cpp: In function
void print_node(...)':
(...)Einfach nur frustrierend
-
okay, es war eigene Doofheit, denn ich habe im Include nur libxml statt libxml++ geschrieben. Viel bedenklicher finde ich allerdings, das was mir der g++ jetzt zurückliefert, wo er libxml++ scheinbar richtiug verlinkt hat:
/tmp/cceDuMqg.o(.text+0xd8): In function
print_node(xmlpp::Node const*, unsigned)': : undefined reference to
typeinfo for xmlpp::ContentNode'
/tmp/cceDuMqg.o(.text+0xe0): In functionprint_node(xmlpp::Node const*, unsigned)': : undefined reference to
typeinfo for xmlpp::Node'
/tmp/cceDuMqg.o(.text+0x12b): In functionprint_node(xmlpp::Node const*, unsigned)': : undefined reference to
typeinfo for xmlpp::TextNode'
(...und immer so weiter)WAT???
So einen Fehler habe ich noch nie gesehen und wüsste gern, was es damit auf sich hat. Es scheint also ein Problem innerhalb von libxml zu sein (sind ja Funktionen daraus, die bemängelt werden...komisch).
-
Wahrscheinlich linkst Du nicht richtig.
-
ich linke wie folgt:
g++ -o srv.cgi finaldelta.cpp stdsoap2.cpp soapC.cpp soapServer.cpp -lcurl -lmysqlclient -I/usr/include/libxml++-1.0
(das letzte ist ein I wie Insel)
sieht das falsch aus? Ich bin das manuelle linken nicht so gewöhnt und lass den Job am liebsten von der IDE machen
-
Physikalischer Fehler schrieb:
g++ -o srv.cgi finaldelta.cpp stdsoap2.cpp soapC.cpp soapServer.cpp -lcurl -lmysqlclient -I/usr/include/libxml++-1.0
(das letzte ist ein I wie Insel)
sieht das falsch aus?
Ja, da fehlt wahrscheinlich ein -lxml++ oder so.
-
Nachtrag:
Falls mal wer vor einem ähnlichen Problem steht:
es muss -lxml++-2.6 (oder welche Version auch immer) heissen.