Errore "gnu / stubs-32.h: nessun file o directory simile" durante la compilazione del codice sorgente di Nachos


170

Sto cercando di installare Nachos sul mio laptop e ho Ubuntu 11.04 sul laptop.

Il codice è in C e quindi per costruirlo suppongo che avrò bisogno del cross compilatore. Questo è dove è il mio problema. Ho scaricato il codice sorgente del compilatore incrociato MIPS usando il comando

  wget http://mll.csie.ntu.edu.tw/course/os_f08/assignment/mips-decstation.linux-xgcc.gz

e l'ho decompresso usando

tar zxvf mips-decstation.linux-xgcc.gz      

Va bene, ma quando provo a costruire il codice sorgente del sistema operativo nachos, usando make, ottengo questo errore -

/usr/include/gnu/stubs.h:7:27: fatal error: gnu/stubs-32.h: No such file or directory compilation terminated. make: *** [bitmap.o] Error 1

Sto cercando di seguire le istruzioni fornite qui: http://mll.csie.ntu.edu.tw/course/os_f08/217.htm e tutto funziona bene tranne quando provo ad usare make.


1
Grazie per i tuoi suggerimenti, ora il programma inizia a compilare ma ricevo questo errore _ Ciao, ora ho questo errore - / usr / bin / ld: salto incompatibile / usr / lib / x86_64-linux-gnu / gcc / x86_64- linux-gnu / 4.5.2 / libstdc ++. a durante la ricerca di -lstdc ++ / usr / bin / ld: impossibile trovare -lstdc ++ collect2: ld ha restituito 1 stato di uscita make: *** [nachos] Errore 1 qualsiasi idea su come risolvere Questo ? Cosa dovrei fare al riguardo?
Ashish Agarwal,

Risposte:


352

Manca il pacchetto dev di libc a 32 bit:

Su Ubuntu si chiama libc6-dev-i386 - do sudo apt-get install libc6-dev-i386. Vedi sotto per ulteriori istruzioni per Ubuntu 12.04.

Nelle distribuzioni Red Hat , il nome del pacchetto è glibc-devel.i686(Grazie al commento di David Gardner).

Su CentOS 5.8 , il nome del pacchetto è glibc-devel.i386(Grazie al commento di JimKleck).

Su CentOS 6/7 , il nome del pacchetto è glibc-devel.i686.

Su SLES si chiama glibc-devel-32bit - do zypper in glibc-devel-32bit.

Su Gentoo si chiama sys-libs/glibc- do emerge -1a sys-libs/gcc [ fonte ] (Nota: si può usare equeryper confermare che questo è corretto; fare equery belongs belongs /usr/include/gnu/stubs-32.h)

Su ArchLinux , il nome del pacchetto è lib32-glibc- do pacman -S lib32-glibc.


Stai usando Ubuntu 12.04 ? Esiste un problema noto che colloca i file in una posizione non standard . Dovrai anche fare:

export LIBRARY_PATH=/usr/lib/$(gcc -print-multiarch)
export C_INCLUDE_PATH=/usr/include/$(gcc -print-multiarch)
export CPLUS_INCLUDE_PATH=/usr/include/$(gcc -print-multiarch)

da qualche parte prima di costruire (ad esempio nel tuo .bashrc).


Se stai anche compilando il codice C ++, avrai bisogno anche della libreria stdc ++ a 32 bit. Se vedi questo avviso:

.... / usr / bin / ld: impossibile trovare -lstdc ++ ....

Su Ubuntu dovrai farlo sudo apt-get install g++-multilib

Su CentOS 5 dovrai farloyum install libstdc++-devel.i386

Su CentOS 6 dovrai farloyum install libstdc++-devel.i686

Non esitate a modificare i pacchetti per altri sistemi.


2
Forse il motivo per cui non ho trovato quel pacchetto è che il mio laptop è a 32 bit ... L'ho comunque trovato libc-dev-amd64. Colpa mia.
Keith Layne,

1
Sì, direi che probabilmente è su una macchina a 64 bit, motivo per cui manca il file. Sulla mia macchina a 64 bit, stubs.h (che ha) è in libc6-dev, mentre stubs-32.h (che non ha) è in libc6-dev-i386. Un buon consiglio su apt-file - non lo sapevo :)
Timothy Jones,

8
Puoi prendere la versione a 32 bit di quella libreria con unsudo apt-get install g++-multilib
Timothy Jones,

1
Per coloro che lo incontrano nelle distribuzioni basate su Red Hat, il pacchetto è glibc-devel.i686 (l'ho appena fatto e questa risposta è stata utile per indicarmi la giusta direzione :)
David Gardner,

2
Esiste un problema noto su Ubuntu 12.04 che inserisce questo file in una directory non standard dopo l'installazione. Questa soluzione ha funzionato per me alla fine gcc.gnu.org/ml/gcc/2012-02/msg00314.html .
Eric Chen,

55

Dal sito Web GNU UPC :

La compilazione del compilatore ha esito negativo con errore irreversibile: gnu / stubs-32.h: nessun file o directory

Questo messaggio di errore viene visualizzato sui sistemi a 64 bit in cui è abilitata la funzione multilib GCC / UPC e indica che la versione a 32 bit di libc non è installata. Esistono due modi per correggere questo problema:

  • Installa la versione a 32 bit di glibc (es. Glibc-devel.i686 su Fedora, CentOS, ..)
  • Disabilita la build 'multilib' fornendo l'opzione "--disable-multilib" sul comando di configurazione del compilatore

8
grazie per una risposta particolarmente utile: la --disable-multilibparte
Negromante

3
@ djhaskin987, gccupc.org non è la fonte, gcc.gnu.org è
Jonathan Wakely,

Ho fatto 'yum install glibc-devel.i686' su x64 centos 6.4
plhn

1
Come si fa con un sistema di creazione basato su autoconf? Ho provato a passare --disable-multilib, ma non cambia nulla. Non ho accesso come root per installare il pacchetto multilib.
user632657,

9

Prova a fare un sudo apt-get install libc6-dev.

apt-file mi dice che il file in questione appartiene a quel pacchetto.


Grazie per la risposta, mi ha aiutato molto: D
Ashish Agarwal,

Questo non è sufficiente su una macchina multiarch poiché continuerai ad avere questo errore anche se hai l'ultima versione di libc6-dev installata.
Geremia,


2

Stavo ottenendo il seguente errore su una scatola fedora 18:


1. /usr/include/gnu/stubs.h:7:27: errore fatale: gnu / stubs-32.h: nessuna compilazione di file o directory terminata.

Ho installato glibc.i686 e glibc-devel.i686, quindi la compilazione non è riuscita con il seguente errore:

2. / usr / bin / ld: salto incompatibile /usr/lib/gcc/x86_64-redhat-linux/4.7.2/libgcc_s.so durante la ricerca di -lgcc_s / usr / bin / ld: impossibile trovare -lgcc_s collect2: errore : ld ha restituito 1 stato di uscita

Soluzione:

Ho installato (installa yum) glibc.i686 glibc-devel.i386 e libgcc.i686 per eliminare il problema della compilazione.

Ora la compilation per 32 bit (-m32) funziona bene.


1

Bene, sono su Ubuntu 12.04 e ho avuto lo stesso errore nel tentativo di compilare gcc 4.7.2

Ho provato a installare il libc6-dev-i386pacchetto e ho ottenuto quanto segue:

Package libc6-dev-i386 is not available, but is referred to by another package.
This may mean that the package is missing, has been obsoleted, or
is only available from another source

E: Package 'libc6-dev-i386' has no installation candidate

Ho anche impostato le variabili d'ambiente corrette in bash:

export LIBRARY_PATH=/usr/lib/$(gcc -print-multiarch)
export C_INCLUDE_PATH=/usr/include/$(gcc -print-multiarch)
export CPLUS_INCLUDE_PATH=/usr/include/$(gcc -print-multiarch)

tuttavia, continuavo a ricevere l'errore, quindi ho semplicemente copiato stubs-32.hsul punto in cui gcc si aspettava di trovarlo dopo aver fatto una rapida diff:

vic@ubuntu:/usr/include/i386-linux-gnu/gnu$ diff ../../gnu ./
Only in ./: stubs-32.h
Only in ../../gnu: stubs-64.h
vic@ubuntu:/usr/include/i386-linux-gnu/gnu$ sudo cp stubs-32.h ../../gnu/
[sudo] password for vic: 
vic@ubuntu:/usr/include/i386-linux-gnu/gnu$ diff ../../gnu ./
Only in ../../gnu: stubs-64.h
vic@ubuntu:/usr/include/i386-linux-gnu/gnu$

Si sta compilando ora, vediamo se si lamenta di più ...


Dispari. Quel pacchetto è definitivamente disponibile in 12.04 (Preciso) vedi pacchetti.ubuntu.com/precise/libc6-dev-i386
Timothy Jones

0

FWIW, puzza come un errore (o almeno una potenziale fonte di dolore futuro) nell'usare i file da / usr / include durante la compilazione incrociata.


1
Penso che stia cercando di costruire la toolchain, non la compilazione incrociata con quelle include.
Keith Layne,

0

gnu/stubs-32.hnon è diretto incluso nei programmi. È un file di intestazione di tipo back-end di gnu/stubs.h, proprio come gnu/stubs-64.h. È possibile installare il multilibpacchetto per aggiungere entrambi.


0

# sudo apt-get install g ++ - multilib

Dovrebbe correggere questo errore su macchine a 64 bit (Debian / Ubuntu).


0

Se stai riscontrando questo problema nel terminale Mac-OSX con python, prova ad aggiornare le versioni dei pacchetti che stai utilizzando. Quindi, vai ai tuoi file in Python e dove hai specificato i pacchetti, aggiornali alle ultime versioni disponibili su Internet.


0

Su Debian / Ubuntu usare:

sudo apt-get install g++-multilib libc6-dev-i386

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.