Xerces-C Linker Error: undefined reference



  • Hallo!

    Ich habe ein Problem mit meiner SAX2 DefaultHandler Klasse. Beim Linken bekommen ich folgenden Fehler.

    # 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 -lxerces-c
    sax1.o: In function `main':
    sax1.cpp:(.text+0x12c): undefined reference to `TestHandler::TestHandler()'
    collect2: ld gab 1 als Ende-Status zurück
    

    Hier natürlich noch die Quellcodes. Die sax1.cpp sollte eigentlich fehlerfrei sein.

    // sax1.cpp
    #include <xercesc/sax2/SAX2XMLReader.hpp>
    #include <xercesc/sax2/XMLReaderFactory.hpp>
    //#include <xercesc/sax2/DefaultHandler.hpp>
    #include <xercesc/util/XMLString.hpp>
    
    #include "TestHandler.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 = "login.xml";
        SAX2XMLReader* parser = XMLReaderFactory::createXMLReader();
        parser->setFeature(XMLUni::fgSAX2CoreValidation, true);   
        parser->setFeature(XMLUni::fgSAX2CoreNameSpaces, true);   // optional
    
        //DefaultHandler* defaultHandler = new DefaultHandler();
        TestHandler* defaultHandler = new TestHandler();
        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;
    }
    
    // TestHandler.hpp
    #include <xercesc/sax2/DefaultHandler.hpp>
    
    XERCES_CPP_NAMESPACE_USE
    
    #include <cstring>
    
    using namespace std;
    
    class TestHandler : public DefaultHandler
    {
    	private:
    		//
    
    	public:
    		TestHandler();
    		~TestHandler();
    
    		virtual void startDocument();
    		virtual void endDocument();
    };
    
    // TestHandler.cpp
    #include "TestHandler.hpp"
    
    TestHandler::TestHandler()
    {
    
    }
    
    TestHandler::~TestHandler()
    {
    
    }
    
    void TestHandler::startDocument()
    {
    	cout << "document start" << endl;
    }
    
    void TestHandler::endDocument()
    {
    	cout << "document end" << endl;
    }
    

    Ich hoffe, dass mir jemand helfen kann. 🙂

    Gruß, aREK



  • Folgendes hat geholfen:

    # g++ -c -I/home/arek/dev/xerces-c/xerces-c_2_8_0-x86-linux-gcc_3_4/include sax1.cpp [b]TestHandler.cpp[/b]
    # g++ -o sax1 -L/home/arek/dev/xerces-c/xerces-c_2_8_0-x86-linux-gcc_3_4/lib -lxerces-c sax1.o [b]TestHandler.o[/b]
    

    Kann also geschlossen werden!

    Gruß


Anmelden zum Antworten