TinyXML und MSVC++ 2008 Express



  • Hallo,

    auf der Suche nach einem kleinen XML Parses bin ich auf TinyXML gestoßen und habe nun versucht es in mein Projekt einzubinden. Allerdings scheine ich irgendetwas falsch zu machen, denn ich bekomme einige Fehlermeldungen.

    Zum Testen habe ich einfach ein neues Projekt namens "test2" erstellt und dort eine "main.cpp". Diese sieht so aus:

    #include "tinyxml/tinyxml.h"
    
    int main()
    {
    }
    

    Im Projektordner (in dem sich auch die main.cpp befindet) habe ich einen weiteren Ordner namens "tinyxml" erstellt und dorthin diese .zip - Datei entpackt. Nach der Onlinedokumentation sollte dies reichen um TinyXML in ein Projekt einzubinden.

    Allerdings bekomme ich einige Fehler. Hier mal die Ausgabeliste:

    1>------ Erstellen gestartet: Projekt: test2, Konfiguration: Debug Win32 ------
    1>Kompilieren...
    1>main.cpp
    1>Verknüpfen...
    1>main.obj : error LNK2028: Nicht aufgelöstes Token (0A000067) ""public: virtual __thiscall TiXmlNode::~TiXmlNode(void)" (??1TiXmlNode@@$$FUAE@XZ)", auf das in Funktion ""public: __thiscall TiXmlText::TiXmlText(class TiXmlText const &)" (??0TiXmlText@@$$FQAE@ABV0@@Z)" verwiesen wird.
    1>main.obj : error LNK2028: Nicht aufgelöstes Token (0A000073) ""protected: __thiscall TiXmlNode::TiXmlNode(enum TiXmlNode::NodeType)" (??0TiXmlNode@@$$FIAE@W4NodeType@0@@Z)", auf das in Funktion ""public: __thiscall TiXmlText::TiXmlText(class TiXmlText const &)" (??0TiXmlText@@$$FQAE@ABV0@@Z)" verwiesen wird.
    1>main.obj : error LNK2028: Nicht aufgelöstes Token (0A00008E) ""protected: void __thiscall TiXmlUnknown::CopyTo(class TiXmlUnknown *)const " (?CopyTo@TiXmlUnknown@@$$FIBEXPAV1@@Z)", auf das in Funktion ""public: __thiscall TiXmlUnknown::TiXmlUnknown(class TiXmlUnknown const &)" (??0TiXmlUnknown@@$$FQAE@ABV0@@Z)" verwiesen wird.
    1>main.obj : error LNK2028: Nicht aufgelöstes Token (0A00009C) ""protected: void __thiscall TiXmlText::CopyTo(class TiXmlText *)const " (?CopyTo@TiXmlText@@$$FIBEXPAV1@@Z)", auf das in Funktion ""public: __thiscall TiXmlText::TiXmlText(class TiXmlText const &)" (??0TiXmlText@@$$FQAE@ABV0@@Z)" verwiesen wird.
    1>main.obj : error LNK2020: Nicht aufgelöstes Token (0A0000B1) "private: static struct TiXmlString::Rep TiXmlString::nullrep_" (?nullrep_@TiXmlString@@0URep@1@A).
    1>main.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""private: static struct TiXmlString::Rep TiXmlString::nullrep_" (?nullrep_@TiXmlString@@0URep@1@A)".
    1>main.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: virtual __thiscall TiXmlNode::~TiXmlNode(void)" (??1TiXmlNode@@$$FUAE@XZ)" in Funktion ""public: __thiscall TiXmlText::TiXmlText(class TiXmlText const &)" (??0TiXmlText@@$$FQAE@ABV0@@Z)".
    1>main.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""protected: void __thiscall TiXmlText::CopyTo(class TiXmlText *)const " (?CopyTo@TiXmlText@@$$FIBEXPAV1@@Z)" in Funktion ""public: __thiscall TiXmlText::TiXmlText(class TiXmlText const &)" (??0TiXmlText@@$$FQAE@ABV0@@Z)".
    1>main.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""protected: __thiscall TiXmlNode::TiXmlNode(enum TiXmlNode::NodeType)" (??0TiXmlNode@@$$FIAE@W4NodeType@0@@Z)" in Funktion ""public: __thiscall TiXmlText::TiXmlText(class TiXmlText const &)" (??0TiXmlText@@$$FQAE@ABV0@@Z)".
    1>main.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""public: virtual void __thiscall TiXmlText::Print(struct _iobuf *,int)const " (?Print@TiXmlText@@UBEXPAU_iobuf@@H@Z)".
    1>main.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""public: virtual char const * __thiscall TiXmlText::Parse(char const *,class TiXmlParsingData *,enum TiXmlEncoding)" (?Parse@TiXmlText@@UAEPBDPBDPAVTiXmlParsingData@@W4TiXmlEncoding@@@Z)".
    1>main.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""protected: virtual class TiXmlNode * __thiscall TiXmlText::Clone(void)const " (?Clone@TiXmlText@@MBEPAVTiXmlNode@@XZ)".
    1>main.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""public: virtual bool __thiscall TiXmlText::Accept(class TiXmlVisitor *)const " (?Accept@TiXmlText@@UBE_NPAVTiXmlVisitor@@@Z)".
    1>main.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""protected: void __thiscall TiXmlUnknown::CopyTo(class TiXmlUnknown *)const " (?CopyTo@TiXmlUnknown@@$$FIBEXPAV1@@Z)" in Funktion ""public: __thiscall TiXmlUnknown::TiXmlUnknown(class TiXmlUnknown const &)" (??0TiXmlUnknown@@$$FQAE@ABV0@@Z)".
    1>main.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""public: virtual void __thiscall TiXmlUnknown::Print(struct _iobuf *,int)const " (?Print@TiXmlUnknown@@UBEXPAU_iobuf@@H@Z)".
    1>main.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""public: virtual char const * __thiscall TiXmlUnknown::Parse(char const *,class TiXmlParsingData *,enum TiXmlEncoding)" (?Parse@TiXmlUnknown@@UAEPBDPBDPAVTiXmlParsingData@@W4TiXmlEncoding@@@Z)".
    1>main.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""public: virtual class TiXmlNode * __thiscall TiXmlUnknown::Clone(void)const " (?Clone@TiXmlUnknown@@UBEPAVTiXmlNode@@XZ)".
    1>main.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""public: virtual bool __thiscall TiXmlUnknown::Accept(class TiXmlVisitor *)const " (?Accept@TiXmlUnknown@@UBE_NPAVTiXmlVisitor@@@Z)".
    1>C:\Users\Fabian\Desktop\Visual Studio 2008\Projects\test2\Debug\test2.exe : fatal error LNK1120: 18 nicht aufgelöste externe Verweise.
    1>Das Buildprotokoll wurde unter "file://c:\Users\Ich\Desktop\Visual Studio 2008\Projects\test2\test2\Debug\BuildLog.htm" gespeichert.
    1>test2 - 19 Fehler, 0 Warnung(en)
    ========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========

    Ich hoffe, dass ich hier im richtigen Forum gelandet bin und mir jemand (der TinyXML benutzt) helfen kann.

    Danke für die Aufmerksamkeit,
    ScRaT



  • Hallo,

    es reicht zwar, den tinyxml-Ordner einfach dort hinzuzufügen, aber die dort enthaltenen Dateien müssen auch in den Kompilierungsprozess mit einbezogen werden. Am einfachsten ist, du ziehst den tinyxml-Ordner aus dem Explorer auf den Namen des Projekts im Visual Studio-Projektfensterm, dann werden alle Dateien automatisch hinzugefügt. Dann solltest du noch in den Projekteigenschaften die Verwendung vorkompilierter Header ausschalten (Konfigurationseigenschaften->C/C++ -> Vorkompilierte Header).

    MfG,

    Probe-Nutzer



  • Vielen Dank! Das war das Problem.

    VC++ sucht sich also nicht automatisch die Dateien? Die Standardheader <vector>, etc. muss ich ja auch nicht extra hinzufügen. Wieso nicht?

    MfG,
    ScRaT



  • VC++ sucht sich also nicht automatisch die Dateien?

    Nein, man gibt zwar mit

    #include "tinyxml/tinyxml.h"
    

    an, dass man möchte, dass die Funktionen, die z.B. in main aufgerufen werden sollen, dem Compiler bekannt sein sollen, aber das ist für den Compiler keine Aufforderung, irgendwelche weiteren .cpp-Dateien zu kompilieren, um daraus z.B. .obj- oder .lib-Dateien zu erzeugen. Da im tinyxml-Download keine fertig kompilierten Dateien (z.B. .obj oder .lib) enthalten sind, muss man die also noch erzeugen, und durch Hinzufügen dieser Dateien zum Projekt werden die dann auch berücksichtigt.

    Die Standardheader <vector>, etc. muss ich ja auch nicht extra hinzufügen. Wieso nicht?

    Doch, musst du, wenn vector verwendet werden soll. Es kann natürlich sein, dass irgendeine andere Datei schon vector includiert, so dass man es scheinbar ohne eigenes Zutun verwenden kann.

    Ansonsten muss der Compiler (besser gesagt der Linker, der das "Verknüpfen", das zu den Fehlermeldungen führte, erledigt) für das Finden der schon fertig kompilierten aufgerufenen Standard-Funktionen auf schon vorhandene .obj- bzw. .-lib-Dateien zurückgreifen, was auch naheliegend ist, weil es sich hier um Standard-Teile handelt, die auch schon "fertig" vorhanden sein sollten.

    MfG,

    Probe-Nutzer



  • Von TinyXml hört man immmer wieder, dass es recht fehlerhaft ist. Außerdem ist es nicht gerade schnell (ich hab z.B. einige designtechnisch unnötige dynamic_casts gefunden).

    Alternativen sind
    http://rapidxml.sourceforge.net/
    Ist templatebasiert. wenn du nicht auf char stehst, sondern lieber wchar verwendest, sicher die bessere Lösung.
    Wenn man den Vergleichen glauben kann, so ziemlich der schnellste existierende XML-Parser.

    http://code.google.com/p/pugixml/
    Das werde ich in Zukunft verwenden. Ist auch um einiges schneller als TinyXml, verwendet fix "char" für strings, etwas flexibler als rapidxml (z.B. was die Speicherverwaltung betrifft), hat XPath-Unterstützung (fehlt z.B. auch bei TinyXml).

    Vllt. bringt dir das ja was 🙂



  • Danke für die Tips.
    Ich muss zugeben, dass ich mit TinyXML bis jetzt auch noch nicht wirklich zurechtkomme.

    Da ich allerdings nur einfachste XML Dateien lesen muss, deren Struktur immer gleich ist, ist es vielleicht am einfachsten ich schreibe mir dafür einen eigenen kleinen Parser. Ist vielleicht auch eine ganz gute Übung.

    MfG,
    ScRaT



  • Bi mir kam beim Linken
    private: static struct TiXmlString::Rep TiXmlString::nullrep_
    als unaufgelöstes Element.
    Problembehebung: In den Compiler-Einstellungen muss man bei den Preprozessor-defines folgendes Element auflisten: TIXML_USE_STL
    Hoffe, das hilft Euch


Anmelden zum Antworten