2010-06-25 21 views
25

Wenn ich versuche, eine Kopie meines Projekts auf meinem lokalen Computer zu kompilieren, erhalte ich die Fehlermeldung, dass inkompatible Bibliotheken übersprungen werden. Dies ist nicht der Fall, wenn ich mich mit der Live-Version beschäftige, die auf dem Server bei der Arbeit gehostet wird [das macht es perfekt].Überspringen inkompatibler Bibliotheken beim Kompilieren

Verschiedene andere Seiten haben mich glauben lassen, dass dies ein Umgebungsproblem sein könnte, da ich auf einer 64-Bit-Distribution von Ubuntu entwickle und ich nehme an, dass die Serverversion auf 32-Bit läuft. Doch nach meinen Umgebungsvariablen zu:

CFLAGS+=" -m32" 
CXXFLAGS+=" -m32" 

Ich erhalte immer noch den gleichen Compiler-Fehler von:

/usr/bin/ld: skipping incompatible /dvlpmnt/libPI-Http.a when searching for -lPI-Http 

Kann Tutorial haz?

== bearbeiten ==

Dies war der Ausgang ich erhielt, als ich Jonathan Rat gefolgt:

http.o: ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped 

Offenbar ist die Bibliothek in Frage 32-Bit immerhin?

+1

Ist diese Bibliothek definitiv 32-Bit? Versuchen Sie 'file/dvlpmtnt/libPI-Http.a' – Rup

+0

@Rup: das ist wahrscheinlich 'aktuelle AR-Archiv' sagen, die nicht schrecklich hilfreich ist. Sie müssen auf eine Datei innerhalb des Archivs zugreifen, wie in meiner Antwort gezeigt. –

+0

Bitte schreiben Sie die Linker-Befehlszeile ... Sie haben recht, es scheint, dass die Bibliothek 32-Bit ist, aber vielleicht sucht der Linker nach 64-Bit-Bibliotheken trotz allem, was Sie dachten, dass Sie getan haben. –

Antwort

28

Diese Nachricht ist nicht wirklich ein Fehler - es ist nur eine Warnung, dass die betreffende Datei nicht die richtige Architektur hat (z. B. 32-Bit-vs 64-Bit, falsche CPU-Architektur). Der Linker sucht weiter nach einer Bibliothek des richtigen Typs.

Natürlich, wenn Sie auch einen Fehler nach dem Vorbild der can't find lPI-Http dann immer haben Sie ein Problem :-)

Es ist schwer zu empfehlen, was die genauen Heilmittel ohne zu wissen, die Details Ihres Build-Systems sein werden, und Makefiles, aber hier sind ein paar Schüsse in der Dunkelheit:

  1. einfach zu überprüfen: in der Regel würden Sie Flags CFLAGS hinzufügen statt CTAGS - sind Sie sicher, dass dies richtig? (Was du hast, mag stimmen - das hängt von deinem Build-System ab!)
  2. Oft muss die Fahne auch an den Linker übergeben werden - so müssen Sie möglicherweise auch LDFLAGS

ändern, wenn das nicht hilft - können Sie den vollständigen Fehlerausgang sowie den eigentlichen Befehl Post (zB gcc foo.c -m32 -Dxxx etc) das gerade ausgeführt wurde?

+1

Es tut mir leid, du hast Recht. Ich habe CFLAGS anstelle von CTAGS verwendet: P –

+0

Zusätzlich zu dieser Lösung können Sie '' WL, - no-warn-search-mismatch'' zu 'CFLAGS' hinzufügen, wodurch diese Warnungen unterdrückt werden. –

9

Normalerweise ist das kein Fehler per se; Es ist eine Warnung, dass die erste gefundene Datei, die dem -lPI-Http-Argument für den Compiler/Linker entspricht, nicht gültig ist. Der Fehler tritt auf, wenn keine andere Bibliothek mit dem richtigen Inhalt gefunden werden kann.

So müssen Sie sehen, ob /dvlpmnt/libPI-Http.a eine Bibliothek von 32-Bit-Objektdateien oder 64-Bit-Objektdateien ist - es wird wahrscheinlich 64-Bit sein, wenn Sie mit der Option -m32 kompilieren. Dann müssen Sie feststellen, ob es eine alternative libPI-Http.a oder libPI-Http.so Datei irgendwo anders gibt, die 32-Bit ist. Ist dies der Fall, stellen Sie sicher, dass das Verzeichnis, in dem es enthalten ist, in einem -L/some/where-Argument für den Linker aufgeführt ist. Wenn nicht, dann müssen Sie von irgendwo eine 32-Bit-Version der Bibliothek erhalten oder erstellen.

Um festzustellen, was in dieser Bibliothek ist, können Sie tun müssen:

mkdir junk 
cd junk 
ar x /dvlpmnt/libPI-Http.a 
file *.o 
cd .. 
rm -fr junk 

Der ‚file‘ Schritt erfahren Sie, welche Art von Objekt-Dateien im Archiv sind. Der Rest sorgt nur dafür, dass Sie keine Unordnung machen, die nicht leicht zu säubern ist.

+1

Huh, das ist seltsam, dieser Schritt zeigt mir jetzt, dass alle fraglichen Bibliotheken tatsächlich 32-Bit sind. o__o –

+1

@defaultstring: Was ist die eigentliche Verbindungsbefehlszeile? Enthält es das Flag "-m32"? Fügen Sie das bitte als zusätzliche Information in der Frage hinzu, anstatt als zusätzlichen Kommentar hier. –

Verwandte Themen