Linkerfehler beim Einbinden von Bibliothek
-
Moin Leute,
folgendes ist mein Problem: ich habe die Bibliothek "libxml2" selber kompiliert (als .a, da unter Linux kompiliert) und in mein Projekt eingebunden. Wenn ich jetzt aber mein Projekt unter Windows baue, dann erhalte ich 1501(!) Fehlermeldungen vom Linker: unresolved external symbol.
Die unresolved external symbols sind aber definitif in der kompilierten Datei enthalten, das habe ich schon per Editor überprüft.
Ich kann mir das nur auf zwei Arten erklären: entweder ist die Biliothek nicht richtig eingebunden oder beim Cross-Compile ist etwas schiefgelaufen. Nur leider fehlen mir die Ideen bzw. das Wissen in der Richtung weiterzukommen, daher hoffe ich auf Unterstützung von euch....
Die Bibliothek habe ich über die Projekteigenschaften eingebunden (relative Pfadangabe, aber auch bei einem absoluten Pfade kommt das gleiche raus) und das Verzeichnis in dem die Header der Biblothek liegen, mit angegeben. Die Dateien liegen auch jeweils in den angegebenen Verzeichnissen.
Beim Kompilieren habe ich msys unter Windows 7 verwendet. Kann das sein daß das Linken fehlschlägt, weil ich unter Linux kompiliert habe aber die Biliothek unter Windows verwende? Eigentlich sollte das doch egal sein, solange die darunterliegende Architektur identisch ist...
Falls das hier nicht das richtige Forum ist bitte Verschieben, aber da es ein Linkerproblem ist und sowohl bei Linux als auch bei Windows hingepasst hätte habe ich das einfach mal hier gepostet.
edit: Ich vergaß zu erwähnen, der Linkerfehler ist in allen Fällen LNK2001.
-
C++ hat keine standardisierte ABI. Das heißt du kannst Bibliotheken in der Regel nur nutzen, wenn Programm und Bibliothek mit dem selben Compiler erstellt wurden.
-
Hellcat schrieb:
Kann das sein daß das Linken fehlschlägt, weil ich unter Linux kompiliert habe aber die Biliothek unter Windows verwende? Eigentlich sollte das doch egal sein, solange die darunterliegende Architektur identisch ist...
Wie kommst du auf die Idee, dass das funktioniert?
Lars
-
Das habe ich schlecht formuliert - msys dient ja dazu Linux-Bibliotheken unter Windows kompilieren zu können, ist also quasi ein Linux-Emulator....
-
Hellcat schrieb:
... ist also quasi ein Linux-Emulator....
Nein, es stellt nur einige benötigte Werkzeuge (shell, make ...) zur Verfügung, um Bibliotheken auf Windows zu übersetzen. D.h. aber nicht, dass du eine auf Linux übersetzte Bibliothek auf auf Windows benutzten kannst.
Lars
-
Hellcat schrieb:
...weil ich unter Linux kompiliert habe aber die Biliothek unter Windows verwende? Eigentlich sollte das doch egal sein, solange die darunterliegende Architektur identisch ist...
Das Gemeine ist ja sogar:
ipsec schrieb:
...wenn Programm und Bibliothek mit dem selben Compiler erstellt wurden.
!!
Es würde also nicht einmal dasselbe System reichen - schon unterschiedliche Compiler(-versionen) können das scheitern lassen.Gruß,
Simon2.
-
Hallo
Auch wenn alle anderen Recht haben, funktioniert dies mit libxml2. Hab ich auch schon gemacht, aber du _musst_ dann auch den mingw in deinem Linux installieren und nicht den Standard g++.
Desweiteren musst du beim übersetzten auch die Zielplattform angeben. Dadurch bekommst du dann auch eine passende lib für Windows.
Aber natürlich solltest du schon schauen das die Compilerversionen nicht zu sehr unterscheiden. Ebenso ist es wichtig das beide 32 bzw. 64 Bit System sind!
Wobei ich seit dem umstieg auf 64Bit von libxml2 weg bin und jetzt tinyXML benutze. Ist einfacher und passte eher zu C++.
PS: Du bist im falschen Forum, solltest lieber ins Compiler Forum und dort gibt es auch schon entsprechende Threads mit dem Thema Crosscompile. (Einfach mal die Suche benutzen)
Mfg marco
-
@Marc-O,
libxml2 ist aber eine C Bibliothek. C hat im Gegensatz zu C++ ein standardisiertes ABI. Und wenn ich dich richtig verstanden habe, hast du unter Linux einfach einer Windows DLL kompiliert. Das geht natürlich auch, sofern der Kompiler dies unterstützt. Windows speichert DLLs und ausführbare Files im PE Format während auf Linux meistens ELF zum Einsatz kommt.Grüssli
-
Hallo
Dravere schrieb:
@Marc-O,
libxml2 ist aber eine C Bibliothek. C hat im Gegensatz zu C++ ein standardisiertes ABI. Und wenn ich dich richtig verstanden habe, hast du unter Linux einfach einer Windows DLL kompiliert. Das geht natürlich auch, sofern der Kompiler dies unterstützt. Windows speichert DLLs und ausführbare Files im PE Format während auf Linux meistens ELF zum Einsatz kommt.Grüssli
Ja libxml2 ist eine C Bibliothek. Jein, es kamm eine Windows DLL heraus aber auch zusätzlich eine .a- sowie eine .lib-Datei. Welche ich entsprechend mit Linken musste.
Und wegen dem das es eine C Biblo ist bin ich auch jetzt Weg davon. Ständige die Wrapperklasse ausrum bauen nervt :(.
Aber wie gesagt MinGW selbst ist ein Compiler der darauf ausgelegt ist Programme für entsprechend andere Betriebssysteme zu übersetzten aber dies muss mit angegeben werden.
OT: Die 2 Links sind sehr interressant muss ich mir mal genauer anschauen wenn ich heute Abend nach der Arbeit noch Zeit und Lust habe

Mfg marco
-
Dravere schrieb:
...C hat ...ein standardisiertes ABI...
Echt?

War mir bislang unbekannt.
So richtig? Auch mit "endianess" und int-Länge und so?Gruß,
Simon2.