GNU/Linux >> Linux Esercitazione >  >> Linux

Perché clang ha ancora bisogno di libgcc.a per compilare il mio codice?

Devi compilare con l'opzione -nodefaultlib o -nostdlibs .

Ecco una citazione dalla documentazione di GCC (l'interfaccia clang è la stessa):

Una delle librerie standard bypassate da -nostdlib e -nodefaultlibs è libgcc.a , una libreria di subroutine interne che GCC utilizza per superare le carenze di macchine particolari o esigenze speciali per alcuni linguaggi.

Potrebbe essere necessario eseguire routine di inizializzazione statica c++ e/o utilizzare quanto fornito dai file oggetto crt<x>.o nella directory lib. Questi file fanno parte di libc e fornisce un punto di ingresso eseguibile.


Clang non viene fornito con un linker, si basa su ld invece. E ld dipende da libgcc.a e/o libgcc.so sul tuo sistema (indipendentemente dal fatto che questo sia il linker LLVM ld.lld o GNU ld). Questo è il motivo per cui hai questo messaggio di errore.

Quindi la risposta è in realtà:

(a) il linker richiede che libgcc esegua il proprio lavoro di collegamento

Maggiori dettagli su questo sono disponibili qui su omniprog.info:

Se vogliamo sbarazzarci di GCC e usare clang come nostro compilatore predefinito sul sistema, potremmo dover apportare alcune modifiche su alcuni sistemi basati su RPM. Clang non fornisce un linker, ma si affida al linker del sistema, tipicamente ld, per collegare gli eseguibili. Questo è il caso anche su sistemi FreeBSD e Mac OS X dove Clang è il compilatore predefinito. Possiamo vederlo usando l'opzione -v di clang++. Ora, ld non funzionerà senza i seguenti file:

libgcc.a
libgcc_s.so
[...]


Linux
  1. Perché Sudo ignora gli alias?

  2. Perché Unix Time inizia al 1970-01-01?

  3. Perché Rsync non riesce con tubo rotto (32), errore nella presa Io (codice 10) su Io.c(820)??

  4. Perché Ubuntu ha bisogno di due kernel?

  5. Perché abbiamo bisogno di mktemp?

Hashing delle password e perché ne abbiamo bisogno

Perché l'utente root ha bisogno dell'autorizzazione Sudo?

Perché `esce &` non funziona?

La modifica dello scambio richiede un riavvio?

Cosa succede se [[ $? -ne 0 ]]; significa in .ksh

Perché è necessario inizializzare un dispositivo raid 10?