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.onur 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