GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Warum benötigt Clang immer noch libgcc.a, um meinen Code zu kompilieren?

Sie müssen mit der Option -nodefaultlib kompilieren oder -nostdlibs .

Hier ein Zitat aus der GCC-Dokumentation (Clang-Schnittstelle ist genauso):

Eine der Standardbibliotheken, die von -nostdlib umgangen wird und -nodefaultlibs ist libgcc.a , eine Bibliothek interner Subroutinen, die GCC verwendet, um Mängel bestimmter Maschinen oder spezielle Anforderungen für einige Sprachen zu überwinden.

Möglicherweise müssen Sie statische C++-Initialisierungsroutinen ausführen und/oder verwenden, was von den Objektdateien crt<x>.o bereitgestellt wird im lib-Verzeichnis. Diese Dateien sind Teil von libc und bietet einen ausführbaren Einstiegspunkt.


Clang kommt nicht mit einem Linker, es verlässt sich auf ld stattdessen. Und ld hängt von libgcc.a ab und/oder libgcc.so auf Ihrem System (unabhängig davon, ob dies der LLVM-Linker ld.lld ist oder GNU-ld). Aus diesem Grund erhalten Sie diese Fehlermeldung.

Die Antwort lautet also eigentlich:

(a) Der Linker verlangt, dass libgcc seine eigene Linkarbeit durchführt

Viele weitere Details dazu finden Sie hier auf omniprog.info:

Wenn wir GCC loswerden und Clang als unseren Standard-Compiler auf dem System verwenden wollen, müssen wir möglicherweise einige Anpassungen an einigen RPM-basierten Systemen vornehmen. Clang stellt keinen Linker bereit, sondern verlässt sich auf den Linker des Systems, typischerweise ld, um ausführbare Dateien zu verknüpfen. Dies ist sogar auf FreeBSD- und Mac OS X-Systemen der Fall, auf denen Clang der Standard-Compiler ist. Wir können dies sehen, indem wir die Option -v für clang++ verwenden. Jetzt funktioniert ld nicht ohne die folgenden Dateien:

libgcc.a
libgcc_s.so
[...]


Linux
  1. Warum benötigt der Root-Benutzer eine Sudo-Berechtigung?

  2. Warum ignoriert Sudo Aliasse?

  3. Warum beginnt die Unix-Zeit am 1.1.1970?

  4. Warum schlägt Rsync mit Broken Pipe (32), Fehler in Socket Io (Code 10) bei Io.c(820) fehl??

  5. Warum braucht Ubuntu zwei Kernel?

Was ist ein Linux-Server und warum benötigt Ihr Unternehmen einen?

Passwort-Hashing und warum wir es brauchen

Warum funktioniert `exit &` nicht?

Benötigt das Ändern der Swapiness einen Neustart?

Was bedeutet, wenn [[ $? -ne 0 ]]; bedeuten in .ksh

Warum stürzt dieser Code bei aktivierter Adress-Randomisierung ab?