xerces-c Linkerfehler mit g++ unter Linux



  • Hallo Leute.

    Ich habe ein Problem mit der Xerces-C Bibliothek unter Verwendung des Compilers/Linkers g++.

    Ich wollte das folgende Testprogramm kompilieren:

    #include <xercesc/sax2/SAX2XMLReader.hpp>
    #include <xercesc/sax2/XMLReaderFactory.hpp>
    #include <xercesc/sax2/DefaultHandler.hpp>
    #include <xercesc/util/XMLString.hpp>
    
    #if defined(XERCES_NEW_IOSTREAMS)
    #include <iostream>
    using namespace std;
    #else
    #include <iostream.h>
    #endif
    
    XERCES_CPP_NAMESPACE_USE
    
    int main (int argc, char* args[]) {
    
        try {
            XMLPlatformUtils::Initialize();
        }
        catch (const XMLException& toCatch) {
            char* message = XMLString::transcode(toCatch.getMessage());
            cout << "Error during initialization! :\n";
            cout << "Exception message is: \n"
                 << message << "\n";
            XMLString::release(&message);
            return 1;
        }
    
        char* xmlFile = "x1.xml";
        SAX2XMLReader* parser = XMLReaderFactory::createXMLReader();
        parser->setFeature(XMLUni::fgSAX2CoreValidation, true);   
        parser->setFeature(XMLUni::fgSAX2CoreNameSpaces, true);   // optional
    
        DefaultHandler* defaultHandler = new DefaultHandler();
        parser->setContentHandler(defaultHandler);
        parser->setErrorHandler(defaultHandler);
    
        try {
            parser->parse(xmlFile);
        }
        catch (const XMLException& toCatch) {
            char* message = XMLString::transcode(toCatch.getMessage());
            cout << "Exception message is: \n"
                 << message << "\n";
            XMLString::release(&message);
            return -1;
        }
        catch (const SAXParseException& toCatch) {
            char* message = XMLString::transcode(toCatch.getMessage());
            cout << "Exception message is: \n"
                 << message << "\n";
            XMLString::release(&message);
            return -1;
        }
        catch (...) {
            cout << "Unexpected Exception \n" ;
            return -1;
        }
    
        delete parser;
        delete defaultHandler;
        return 0;
    }
    

    Beim Linken bekommen ich allerdings folgende Fehlermeldungen, mit denen ich leider nichts anfangen kann.

    # g++ -c -I/home/arek/dev/xerces-c/xerces-c_2_8_0-x86-linux-gcc_3_4/include sax1.cpp
    # g++ -o sax1 -L/home/arek/dev/xerces-c/xerces-c_2_8_0-x86-linux-gcc_3_4/lib sax1.o
    sax1.o: In function `main':
    sax1.cpp:(.text+0x85): undefined reference to `xercesc_2_8::XMLUni::fgXercescDefaultLocale'
    sax1.cpp:(.text+0xad): undefined reference to `xercesc_2_8::XMLPlatformUtils::Initialize(char const*, char const*, xercesc_2_8::PanicHandler*, xercesc_2_8::MemoryManager*, bool)'
    sax1.cpp:(.text+0xb9): undefined reference to `xercesc_2_8::XMLPlatformUtils::fgMemoryManager'
    sax1.cpp:(.text+0xc9): undefined reference to `xercesc_2_8::XMLReaderFactory::createXMLReader(xercesc_2_8::MemoryManager*, xercesc_2_8::XMLGrammarPool*)'
    sax1.cpp:(.text+0xdb): undefined reference to `xercesc_2_8::XMLUni::fgSAX2CoreValidation'
    sax1.cpp:(.text+0xfe): undefined reference to `xercesc_2_8::XMLUni::fgSAX2CoreNameSpaces'
    sax1.cpp:(.text+0x17f): undefined reference to `xercesc_2_8::XMLString::transcode(unsigned short const*)'
    sax1.cpp:(.text+0x1da): undefined reference to `xercesc_2_8::XMLString::release(char**)'
    sax1.cpp:(.text+0x2bf): undefined reference to `xercesc_2_8::XMLString::transcode(unsigned short const*)'
    sax1.cpp:(.text+0x306): undefined reference to `xercesc_2_8::XMLString::release(char**)'
    sax1.cpp:(.text+0x358): undefined reference to `xercesc_2_8::XMLString::transcode(unsigned short const*)'
    sax1.cpp:(.text+0x39f): undefined reference to `xercesc_2_8::XMLString::release(char**)'
    sax1.o: In function `xercesc_2_8::DefaultHandler::fatalError(xercesc_2_8::SAXParseException const&)':
    sax1.cpp:(.text._ZN11xercesc_2_814DefaultHandler10fatalErrorERKNS_17SAXParseExceptionE[xercesc_2_8::DefaultHandler::fatalError(xercesc_2_8::SAXParseException const&)]+0x2b): undefined reference to `xercesc_2_8::SAXParseException::SAXParseException(xercesc_2_8::SAXParseException const&)'
    sax1.cpp:(.text._ZN11xercesc_2_814DefaultHandler10fatalErrorERKNS_17SAXParseExceptionE[xercesc_2_8::DefaultHandler::fatalError(xercesc_2_8::SAXParseException const&)]+0x33): undefined reference to `xercesc_2_8::SAXParseException::~SAXParseException()'
    sax1.cpp:(.text._ZN11xercesc_2_814DefaultHandler10fatalErrorERKNS_17SAXParseExceptionE[xercesc_2_8::DefaultHandler::fatalError(xercesc_2_8::SAXParseException const&)]+0x3b): undefined reference to `typeinfo for xercesc_2_8::SAXParseException'
    sax1.o:(.gcc_except_table+0x74): undefined reference to `typeinfo for xercesc_2_8::XMLException'
    sax1.o:(.gcc_except_table+0x78): undefined reference to `typeinfo for xercesc_2_8::SAXParseException'
    collect2: ld gab 1 als Ende-Status zurück
    

    Meine g++ Version:

    # g++ -v
    Es werden eingebaute Spezifikationen verwendet.
    Ziel: i486-linux-gnu
    Konfiguriert mit: ../src/configure -v --enable-languages=c,c++,fortran,objc,obj-c++,treelang --prefix=/usr --enable-shared --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --enable-nls --with-gxx-include-dir=/usr/include/c++/4.1.3 --program-suffix=-4.1 --enable-__cxa_atexit --enable-clocale=gnu --enable-libstdcxx-debug --enable-mpfr --enable-checking=release i486-linux-gnu
    Thread-Modell: posix
    gcc-Version 4.1.3 20070929 (prerelease) (Ubuntu 4.1.2-16ubuntu2)
    

    Ich hoffe, dass mir hier jemand schnellstmöglich helfen kann!

    Danke im Voraus!

    Gruß, aREK



  • Es ist zwar verdammt früh am Morgen, aber ....
    Soweit ich das sehe fehlt die Angabe der Library.

    Du rufst g++ auf und sagst...

    was er erzeugen soll: -o sax1
    wo er suchen soll: -L/home/arek/dev/xerces-c/xerces-c_2_8_0-x86-linux-gcc_3_4/lib
    welche Code (obj) er nehmen soll: sax1.o

    nur welche Library er für xerces linken soll sagst Du nicht. 😉

    Hänge nach dem sax1.o die Library (.a) aus xerces-c_2_8_0-x86-linux-gcc_3_4/lib an. Wenn weiterere Referenzen fehlen musst Du die Libraries auch noch angeben.

    Schau Dir auch mal das Compiler-Flag -l an.



  • Vielen Dank für deine Antwort.

    Habs mir folgender Anweisung geschafft.

    # g++ -o sax1 -L/home/arek/dev/xerces-c/xerces-c_2_8_0-x86-linux-gcc_3_4/lib sax1.o -lxerces-c
    

    Gruß, aREK


Anmelden zum Antworten