Problemi di compilazione: impossibile trovare crt1.o


114

Ho un sistema Debian virtuale che utilizzo per lo sviluppo.

Oggi volevo provare llvm / clang.

Dopo aver installato clang non riesco a compilare i miei vecchi progetti c (con gcc). Questo è l'errore:

...
/usr/bin/ld: cannot find crt1.o: No such file or directory
/usr/bin/ld: cannot find crti.o: No such file or directory
collect2: ld returned 1 exit status
...

Ho disinstallato clang e ancora non ha funzionato.

Qualcuno ha idea di come posso risolvere questo problema?


6
Prova l'installazione libc0.1-dev.
Michas



Questo è un BUG segnalato nel launchpad, ma c'è una soluzione alternativa: askubuntu.com/questions/251978/…
Roman

Risposte:


91

Debian / Ubuntu

Il problema è che probabilmente hai solo il gcc per la tua architettura attuale e questo è a 64 bit. Hai bisogno dei file di supporto a 32 bit. Per questo, è necessario installarli

sudo apt install gcc-multilib

2
Su Ubuntu ha funzionato sudo apt-get install gcc-multilibe ha risolto il mio errore dagfortran -m32 ...
randwa1k


62

Ciò che mi ha aiutato è creare un collegamento simbolico:

sudo ln -s /usr/lib/x86_64-linux-gnu /usr/lib64

5
Questo funziona, tuttavia ti dà effettivamente solo un arco su Debian multiarch.
Geremia

2
Ho avuto lo stesso problema cercando di configurare una toolchain di cross-compilazione che qualcuno mi ha dato come bundle tar. Ho dovuto usare strace (cioè "strace gcc <tutti i miei argomenti> 2> & 1 | grep crt1.o") per vedere dove gcc stava cercando crt1.o, così ho potuto capire quale collegamento simbolico creare.
Andrew Bainbridge

37

Sembra che mentre stavi giocando con llvm / clang tu (o il gestore dei pacchetti) hai rimosso il pacchetto di sviluppo della libreria C standard esistente ( eglibc su Debian) o forse non l'hai installato in primo luogo, quindi devi reinstallarlo it, ora che sei tornato a gcc.

Puoi farlo in questo modo su Debian:

aptitude show libc-dev

Ubuntu:

apt-get install libc-dev

Su Ubuntu, se non hai libc-dev, poiché non riesco a trovarlo su packages.ubuntu.com, puoi provare a installare libc6-dev direttamente.

O su sistemi simili a Redhat:

yum installa glibc-devel

NB: Anche se hai ricevuto una risposta breve nei commenti, ecco una risposta solo così ce n'è una registrata nel caso in cui qualcuno la incontri e potrebbe cercare una risposta, ma non nei commenti o il commento non è abbastanza esplicito per loro .


1
Non che la roba multiarch di Debian rompa molte build, spesso con questo errore. export LD_LIBRARY_PATH può fare il trucco.
deadalnix

3
questo aiuta, per alpine linuxapk add libc-dev=0.7.1-r0
Yu Jiaao

27

Questo è un BUG segnalato nel launchpad, ma c'è una soluzione alternativa:

Esegui questo per vedere dove si trovano questi file

$ find /usr/ -name crti*
/usr/lib/x86_64-linux-gnu/crti.o

quindi aggiungi questo percorso alla variabile LIBRARY_PATH

$ export LIBRARY_PATH=/usr/lib/x86_64-linux-gnu:$LIBRARY_PATH

Funziona il 14.04. Questo è il percorso preferito se non vuoi
manipolare

17

Se stai usando la versione di test di Debian, chiamata 'wheezy', potresti essere stato morso dal passaggio a multiarch. Ulteriori informazioni sul multiarch di Debian qui: http://wiki.debian.org/Multiarch

Fondamentalmente, ciò che sta accadendo è che varie librerie specifiche per l'architettura vengono spostate da luoghi tradizionali nel file system a luoghi specifici per nuova architettura. Questo è il motivo per cui /usr/bin/ldè confuso.

Troverai crt1.o in entrambi /usr/lib64/e /usr/lib/i386-linux-gnu/adesso e dovrai parlarne alla tua toolchain. Ecco della documentazione su come farlo; http://wiki.debian.org/Multiarch/LibraryPathOverview

Nota che la semplice creazione di un collegamento simbolico ti darà solo un'architettura e dovresti essenzialmente disabilitare il multiarchitettura. Sebbene questo possa essere ciò che desideri, potrebbe non essere la soluzione ottimale.


3
Un po 'di più su come "parlarne con la tua toolchain" sarebbe fantastico, poiché questa è esattamente la situazione in cui mi trovo. Grazie.
SullX

In primo luogo, dovrai sapere per quale architettura stai costruendo. Stai creando un'applicazione basata su AMD64? Se è così, dovrai dire a 'ld' dove si trovano i file di oggetti condivisi basati su AMD64, cioè i file .o che ti servono. Se si sta lavorando su un AMD64 dovrebbero essere in / usr / lib64
Geremia

16

Dopo aver letto il http://wiki.debian.org/Multiarch/LibraryPathOverview che jeremiah ha pubblicato, ho trovato il flag gcc che funziona senza il collegamento simbolico:

gcc -B/usr/lib/x86_64-linux-gnu hello.c

Quindi, puoi semplicemente aggiungere -B/usr/lib/x86_64-linux-gnualla variabile CFLAGS nel tuo Makefile.


@DjDac non dovresti aver bisogno di alcun flag in Ubuntu 16.04, AFAICT.
alexm

9

Per ottenere RHEL 7 64 bit per compilare programmi gcc 4.8 a 32 bit, devi fare due cose.

  1. Assicurati che tutti gli strumenti di sviluppo gcc 4.8 a 32 bit siano completamente installati:

    sudo yum install glibc-devel.i686 libgcc.i686 libstdc++-devel.i686 ncurses-devel.i686
  2. Compilare programmi utilizzando il flag -m32

    gcc pgm.c -m32 -o pgm

rubato da qui: come compilare app a 32 bit su RHEL a 64 bit? - Dovevo solo fare il passaggio 1.


6

Come spiegato nel file crti.o mancante , è meglio usare "gcc -print-search-dirs" per scoprire tutto il percorso di ricerca. Quindi creare un collegamento come spiegato sopra "sudo ln -s" per puntare alla posizione di crt1.o


3

Questo ha funzionato per me con Ubuntu 16.04

$ LIBRARY_PATH=/usr/lib/x86_64-linux-gnu
$ export LIBRARY_PATH


1

Ci siamo imbattuti in CentOs 5.4. Notato che lib64 conteneva i file crt * .o, ma lib no. Ho installato glibc-devel tramite yum che ha installato i bit i386 e questo ha risolto il mio problema.


0

Anche io ho ricevuto lo stesso errore di compilazione durante la compilazione incrociata di i686-cm-linux-gcc.

L'opzione di compilazione di seguito ha risolto il mio problema

$ i686-cm-linux-gcc a.c --sysroot=/opt/toolchain/i686-cm-linux-gcc

Nota: sysroot dovrebbe puntare alla directory del compilatore in cui è disponibile usr / include

Nel mio caso la toolchain è installata nella directory / opt / toolchain / i686-cm-linux-gcc e anche usr / include è disponibile nella stessa directory


0

L'ho risolto come segue:

1) prova a individuare i file ctr1.o e ctri.o utilizzando find -name ctr1.o

Ho il seguente nel mio computer: $/usr/lib/i386-linux/gnu

2) Aggiungi quel percorso alla PATH(anche LIBRARY_PATH) variabile d'ambiente (per vedere qual è il nome: digita il envcomando nel Terminale):

$PATH=/usr/lib/i386-linux/gnu:$PATH
$export PATH

Per evitare confusioni, la riga $ PATH = / usr / lib / i386-linux / gnu: $ PATH $ export PATH è in realtà:
pac88

0

Oggi ho avuto lo stesso problema, l'ho risolto installando i pacchetti consigliati: libc6-dev-mipsel-cross libc6-dev-mipsel-cross, libc-dev-mipsel-cross

Questo ha funzionato:

sudo apt-get install libc6-dev-mipsel-cross

-1

Nel mio caso, l'errore crti.o è stato causato dalla configurazione del percorso di esecuzione da Matlab. Ad esempio, non è possibile eseguire un file se non è stato precedentemente impostato il percorso della directory di esecuzione. Per fare ciò: File> setPath, aggiungi la tua directory e salva.



-2

Nel mio caso Ubuntu 16.04non ho crti.oaffatto:

$ find /usr/ -name crti*

Quindi installo il pacchetto sviluppatore libc 6 -dev:

sudo apt-get install libc6-dev
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.