Undefined Reference-Fehler Bei Verlinkung auf Statische Bibliothek
Ich versuche zu kompilieren eines Projekts, das hängt von der Xerces XML-Parser. Das Projekt kompiliert für Windows, ohne jede Schwierigkeit, aber ich habe einige Probleme beim kompilieren mit g++ unter Cygwin.
Um Xerces, ich bin versucht zu kompilieren meinen code gegen die statische Bibliothek libxerces-c.a
. Aber wenn ich das mache, so bekomme ich Fehler, die wie folgt Aussehen:
/tmp/cc2QGvMh.o:test.cpp:(.text+0x3a): undefined reference to `xercesc_2_8::DOMImplementationRegistry::getDOMImplementation(unsigned short const*)'
Habe ich kontrolliert die statische Bibliothek, die mit ar
, und bestätigt, dass es enthält die DOMImplementationRegistry.o
- Datei definiert die Funktion, die ich aufrufen.
ar -t libxerces-c.a
...
DOMImplementationImpl.o
DOMImplementationRegistry.o
DOMLocatorImpl.o
...
Habe ich auch extrahiert das Objekt-Dateien aus der Bibliothek, und verwendet, 'nm', um sicherzustellen, dass die Funktion rufe ich die tatsächlich existiert:
ar -x libxerces-c.a
nm --demangle DOMImplementationRegistry.o
...
00000080 T xercesc_2_8::getDOMImplSrcVectorMutex()
00000300 T xercesc_2_8::DOMImplementationRegistry::getDOMImplementation(unsigned short const*)
000002a0 T xercesc_2_8::DOMImplementationRegistry::addSource(xercesc_2_8::DOMImplementationSource*)
...
Da kann ich kompilieren alles für Windows, aber nicht mit g++, dachte ich, dass könnte der Fehler sein in der linker, um (ähnlich wie das beschriebene problem in diese Frage). Jedoch, sogar nach dem ändern der linker um, ich bin noch immer die gleichen compiler-Fehler. Ich habe versucht, sowohl die
g++ -o test.exe test.cpp -Llib -lxerces-c
und
g++ -o test.exe test.cpp lib/libxerces-c.a
Irgendwelche Ideen?
- Dies könnte möglicherweise problem der unterschiedlichen name mangling schema verwendet, die von verschiedenen Compilern. Könnte Sie liefern Ergebnisse von nm auf Ihre Objekt-Datei und library, ohne --demangle option?
- verwenden Sie die korrekte Verteilung der Bibliothek? xerces-c_2_8_0-x86-linux-gcc_3_4.tar.gz ? oder hast du die Bibliothek selbst auf gcc?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sie nicht sagen, die Quelle des Archivs. Wenn es nicht kompiliert unter cygwin, es könnte ein name mangling problem. Kompilieren Sie die Bibliothek aus dem Quellcode könnte dieses Problem beheben.
Könnte es auch sein, dass das Archiv ist falsch gebaut, so dass es hat eine interne Auflösung Probleme. Versuchen Sie geben den Namen der Bibliothek zweimal.
Wenn das funktioniert, das Archiv ist defekt und Sie suchen sollten, oder ein neues bauen.
Ihrem Projekt nutzt die Methode von xercesc_2_6 namespace wie schon von compiler-Fehlermeldung, sondern Ihre Bibliothek bietet xercesc_2_8 version. Problem ist wahrscheinlich verursacht durch die Diskrepanz zwischen Kopfzeilen, die Sie verwenden und Bibliothek-Objekt-Datei.
Versuchen Sie die linker-option --enable-stdcall-fixup (siehe "man ld'). Es kümmert sich um das name-mangling und Aufrufkonventionen: