5 Stimmen

Der Linker kann 32-Bit-Bibliotheken unter dem 64-Bit Mint-Betriebssystem nicht finden, wenn mit Clang kompiliert wird.

Ich habe gerade Clang 3.5 auf einem 64-Bit Mint OS (Version 17) installiert. Ich versuche, mein Programm in 32-Bit zu kompilieren, aber ich stoße auf Probleme.

Ich habe eine Datei namens test.cpp in meinem Home-Verzeichnis mit folgendem Code:

#include 

int main()
{
    std::cout << "Hallo" << std::endl;
}

Dann führe ich folgenden Befehl aus:

$ clang++ -m32 -Wl,--verbose test.cpp | grep libgcc

Ich erhalte folgende Ausgabe:

$ clang++ -m32 -Wl,--verbose test.cpp | grep libgcc
/usr/bin/ld: überspringen Inkompatibles /usr/bin/../lib/gcc/x86_64-linux-gnu/4.8/libstdc++.so während der Suche nach -lstdc++
/usr/bin/ld: überspringen Inkompatibles /usr/bin/../lib/gcc/x86_64-linux-gnu/4.8/libstdc++.a während der Suche nach -lstdc++
/usr/bin/ld: Kann -lstdc++ nicht finden
/usr/bin/ld: überspringen Inkompatibles /usr/bin/../lib/gcc/x86_64-linux-gnu/4.8/libgcc_s.so während der Suche nach -lgcc_s
Versuch /usr/bin/../lib/gcc/x86_64-linux-gnu/4.8/libgcc_s.so zu öffnen war erfolgreich
/usr/bin/ld: Kann -lgcc_s nicht finden
Versuch /usr/bin/../lib/gcc/x86_64-linux-gnu/4.8/libgcc_s.a zu öffnen fehlgeschlagen
Versuch /usr/bin/../lib/gcc/x86_64-linux-gnu/4.8/../../../i386-linux-gnu/libgcc_s.so zu öffnen fehlgeschlagen
...
clang: Fehler: Linker-Befehl fehlgeschlagen mit Exit-Code 1 (Verwenden Sie -v, um die Aufforderung zu sehen)

Ich habe bereits alle möglichen Recherchen angestellt, aber ich bin mir nicht sicher, warum dieses einfache Beispiel nicht funktioniert. Kann mir jemand dabei helfen herauszufinden, was mir fehlt?

6voto

mauzel Punkte 1556

Hier ist darauf zu achten, wenn Sie mit clang cross-compilieren:

  • Haben Sie 32-Bit (x86) C++-Bibliotheken installiert? (Es scheint, dass Sie dies getan haben, aber sicherheitshalber nachfragen.)

  • Versuchen Sie, den --sysroot= zu verwenden. Dies sagt clang, dass es nach den bin, lib und include Verzeichnissen innerhalb des von Ihnen angegebenen Verzeichnisses suchen soll, anstatt seine (schlecht definierten) fest kodierten Pfade zu verwenden.

  • Versuchen Sie, die -I und -L Optionen zu verwenden, um clang noch genauer mitzuteilen, wo sich Ihre Include- und Lib-Verzeichnisse befinden.

  • Im schlimmsten Fall, wenn keines der obigen Optionen funktioniert: Versuchen Sie, die Option -B zu verwenden, um clang speziell mitzuteilen, welchen Linker es verwenden soll. Versuchen Sie dies in Kombination mit den vorherigen Optionen hinzuzufügen.

Weitere Details finden Sie unter http://clang.llvm.org/docs/CrossCompilation.html (obwohl die -B Option dort nicht behandelt wird)

3voto

Thomas Punkte 2974

Sie müssen ein Multilib g++ installieren sudo apt-get install g++-multilib.

g++-multilib sollte auch alle anderen erforderlichen Abhängigkeiten installieren, wie z. B. libc6-i386.

1voto

GermanDev Punkte 1

Auf einer 64-Bit-Maschine (z. B. AMD64) müssen Sie die 32-Bit-Bibliotheken usw. installieren. Zum Beispiel auf einem Debian 10 (Buster) lautet der Befehl:

sudo apt install libc6-i386 lib32gcc1 lib32gcc-8-dev gcc-8-multilib

Auf Debian 11 (Bullseye) lautet der Befehl:

sudo apt install libc6-i386 lib32gcc-10-dev gcc-10-multilib

(Für C++ fügen Sie g++-8-multilib oder g++-10-multilib hinzu, entsprechend)

Nach diesen Installationen erhalten Sie neue 32-Bit-Bibliotheken in /lib32 und /usr/lib32. Außerdem finden Sie in /etc/ld.so.conf.d neue Konfigurationen (/sbin/ldconfig wird automatisch durch die apt-Installationen ausgeführt).

Auf Debian Buster konnte ich leicht mit gcc und dem -m32-Schalter (gcc-8.3.0) kompilieren. Auf Debian Bullseye (gcc-10.2.0) gab mir allein gcc mit -m32 Schwierigkeiten.

Die richtige Ausführung von gcc für 32-Bit-Programme auf Bullseye ist:

gcc -m32 -Wl,--rpath-link,/usr/lib32 -L/usr/lib32 -nodefaultlibs -nostdlib -o /usr/lib32/crti.o /usr/lib32/crt1.o /usr/lib32/crtn.o -lc -lgcc_s

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X