it-swarm.com.de

Überspringen inkompatibler Bibliotheken beim Kompilieren

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 mit der Live-Version herumspiele, die auf dem Server bei der Arbeit gehostet wird.

Verschiedene andere Sites haben mich zu der Annahme veranlasst, dass dies ein Problem der Umgebung sein könnte, da ich eine 64-Bit-Distribution von Ubuntu entwickle und davon ausgehe, dass die Serverversion auf 32-Bit ausgeführt wird. Nach dem Setzen meiner Umgebungsvariablen auf:

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

Ich erhalte immer noch den gleichen Kompilierungsfehler von:

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

Kann haz Tutorial?

== Bearbeiten==

Dies war die Ausgabe, die ich erhielt, als ich Jonathans Rat befolgte:

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

Anscheinend ist die fragliche Bibliothek doch 32-Bit?

31
kelly.dunn

Diese Meldung ist eigentlich kein Fehler. Es handelt sich lediglich um eine Warnung, dass die betreffende Datei nicht die richtige Architektur aufweist (z. B. 32-Bit- oder 64-Bit-Version, falsche CPU-Architektur). Der Linker wird weiterhin nach einer Bibliothek des richtigen Typs suchen.

Natürlich, wenn Sie auch einen Fehler im Sinne von can't find lPI-Http dann hast du ein problem :-)

Es ist schwer vorzuschlagen, was die genaue Abhilfe sein wird, ohne die Details Ihres Build-Systems und Ihrer Makefiles zu kennen, aber hier sind ein paar Aufnahmen im Dunkeln:

  1. Nur zur Kontrolle: Normalerweise würden Sie Flags zu CFLAGS anstatt zu CTAGS hinzufügen - sind Sie sicher, dass dies korrekt ist? (Was Sie haben, ist möglicherweise richtig - dies hängt von Ihrem Build-System ab!)
  2. Häufig muss das Flag auch an den Linker übergeben werden. Daher müssen Sie möglicherweise auch LDFLAGS ändern.

Wenn das nicht hilft - können Sie die vollständige Fehlerausgabe sowie den tatsächlichen Befehl (z. B. gcc foo.c -m32 -Dxxx etc) wurde das ausgeführt?

32
psmears

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

Sie müssen also prüfen, ob /dvlpmnt/libPI-Http.a Eine Bibliothek mit 32-Bit-Objektdateien oder 64-Bit-Objektdateien ist. Wenn Sie mit -m32 Möglichkeit. Dann müssen Sie feststellen, ob es eine alternative libPI-Http.a - oder libPI-Http.so - Datei gibt, die 32-Bit ist. Wenn ja, stellen Sie sicher, dass das Verzeichnis, in dem es sich befindet, in einem -L/some/where - Argument für den Linker aufgeführt ist. Wenn nicht, müssen Sie irgendwo eine 32-Bit-Version der Bibliothek herunterladen oder erstellen.

Um festzustellen, was sich in dieser Bibliothek befindet, müssen Sie möglicherweise Folgendes tun:

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

Der Schritt 'file' gibt an, welche Art von Objektdateien sich im Archiv befinden. Der Rest stellt nur sicher, dass Sie kein Chaos anrichten, das nicht einfach zu beseitigen ist.

11