Error "gnu / stubs-32.h: No existe tal archivo o directorio" al compilar el código fuente de Nachos


170

Estoy tratando de instalar Nachos en mi computadora portátil y tengo Ubuntu 11.04 en la computadora portátil.

El código está en C y, por lo tanto, para construirlo, supongo que necesitaré un compilador cruzado. Aquí es donde está mi problema. Descargué el código fuente del compilador cruzado MIPS usando el comando

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

y lo descomprimí usando

tar zxvf mips-decstation.linux-xgcc.gz      

Esto está bien, pero cuando trato de construir el código fuente de los nachos os, usando make, aparece este error:

/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

Estoy tratando de seguir las instrucciones dadas aquí: http://mll.csie.ntu.edu.tw/course/os_f08/217.htm y todo funciona bien, excepto cuando trato de usar make.


1
Gracias por sus sugerencias, el programa ahora comienza a compilarse pero recibo este error _ Hola, ahora tengo este error - / usr / bin / ld: omitiendo incompatible / usr / lib / x86_64-linux-gnu / gcc / x86_64- linux-gnu / 4.5.2 / libstdc ++. a al buscar -lstdc ++ / usr / bin / ld: no se puede encontrar -lstdc ++ collect2: ld devolvió 1 estado de salida make: *** [nachos] Error 1 alguna idea sobre cómo solucionarlo esta ? ¿Qué debo hacer al respecto?
Ashish Agarwal

Respuestas:


352

Te falta el paquete de desarrollo de libc de 32 bits:

En Ubuntu se llama libc6-dev-i386 - do sudo apt-get install libc6-dev-i386. Consulte a continuación las instrucciones adicionales para Ubuntu 12.04.

En las distribuciones de Red Hat , el nombre del paquete es glibc-devel.i686(Gracias al comentario de David Gardner).

En CentOS 5.8 , el nombre del paquete es glibc-devel.i386(Gracias al comentario de JimKleck).

En CentOS 6/7 , el nombre del paquete es glibc-devel.i686.

En SLES se llama glibc-devel-32bit - do zypper in glibc-devel-32bit.

En Gentoo se llama sys-libs/glibc- do emerge -1a sys-libs/gcc [ fuente ] (Nota: se puede usar equerypara confirmar que esto es correcto; hacer equery belongs belongs /usr/include/gnu/stubs-32.h)

En ArchLinux , el nombre del paquete es lib32-glibc- do pacman -S lib32-glibc.


¿Estás usando Ubuntu 12.04 ? Existe un problema conocido que coloca los archivos en una ubicación no estándar . Usted también tiene que hacer:

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)

en algún lugar antes de construir (digamos en su .bashrc).


Si también está compilando código C ++, también necesitará la biblioteca stdc ++ de 32 bits. Si ves esta advertencia:

.... / usr / bin / ld: no se puede encontrar -lstdc ++ ....

En Ubuntu deberás hacer sudo apt-get install g++-multilib

En CentOS 5 deberás haceryum install libstdc++-devel.i386

En CentOS 6 deberás haceryum install libstdc++-devel.i686

Por favor, siéntase libre de editar en los paquetes para otros sistemas.


2
Quizás la razón por la que no encontré ese paquete es porque mi computadora portátil es de 32 bits ... Sin embargo, sí encontré libc-dev-amd64. Culpa mía.
Keith Layne

1
Sí, diría que probablemente esté en una máquina de 64 bits, por eso falta el archivo. En mi máquina de 64 bits, stubs.h (que tiene) está en libc6-dev, mientras que stubs-32.h (que no tiene) está en libc6-dev-i386. Un buen consejo sobre apt-file - No lo sabía :)
Timothy Jones

8
Puede obtener la versión de 32 bits de esa biblioteca con unsudo apt-get install g++-multilib
Timothy Jones

1
Para aquellos que encuentran esto en distribuciones basadas en Red Hat, el paquete es glibc-devel.i686 (acabo de hacerlo y esta respuesta fue útil para señalarme en la dirección correcta :)
David Gardner

2
Existe un problema conocido en Ubuntu 12.04 que coloca este archivo en un directorio no estándar después de la instalación. Esta solución me funcionó al final gcc.gnu.org/ml/gcc/2012-02/msg00314.html .
Eric Chen el

55

Desde el sitio web de GNU UPC :

La compilación del compilador falla con un error fatal: gnu / stubs-32.h: no existe tal archivo o directorio

Este mensaje de error aparece en los sistemas de 64 bits donde está habilitada la función multilib GCC / UPC, e indica que la versión de 32 bits de libc no está instalada. Hay dos formas de corregir este problema:

  • Instale la versión de 32 bits de glibc (por ejemplo, glibc-devel.i686 en Fedora, CentOS, ..)
  • Deshabilite la compilación 'multilib' al proporcionar el conmutador "--disable-multilib" en el comando de configuración del compilador

8
gracias por una respuesta particularmente útil: la --disable-multilibparte
nigromante

3
@ djhaskin987, gccupc.org no es la fuente, gcc.gnu.org es
Jonathan Wakely

Hice 'yum install glibc-devel.i686' en x64 centos 6.4
plhn

1
¿Cómo se hace esto con un sistema de marca basado en autoconf? He intentado pasar --disable-multilib, pero no cambia nada. No tengo acceso de root para instalar el paquete multilib.
user632657

9

Intenta hacer un sudo apt-get install libc6-dev.

apt-file me dice que el archivo en cuestión pertenece a ese paquete.


Gracias por su respuesta, ayudó mucho: D
Ashish Agarwal

Esto no es suficiente en una máquina multiarch ya que aún recibirá este error incluso si tiene instalada la última versión de libc6-dev.
jeremiah


2

Estaba recibiendo el siguiente error en una caja de fedora 18:


1. /usr/include/gnu/stubs.h:7:27: error fatal: gnu / stubs-32.h: No finalizó la compilación de dicho archivo o directorio.

Instalé glibc.i686 y glibc-devel.i686, luego la compilación falló con el siguiente error:

2. / usr / bin / ld: omitiendo incompatible /usr/lib/gcc/x86_64-redhat-linux/4.7.2/libgcc_s.so al buscar -lgcc_s / usr / bin / ld: no se puede encontrar -lgcc_s collect2: error : LD devolvió el código de salida 1

Solución:

Instalé (yum install) glibc.i686 glibc-devel.i386 y libgcc.i686 para deshacerme del problema de compilación.

Ahora la compilación para 32 bits (-m32) funciona bien.


1

Hmm, bueno, estoy en Ubuntu 12.04 y obtuve este mismo error al intentar compilar gcc 4.7.2

Intenté instalar el libc6-dev-i386paquete y obtuve lo siguiente:

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

También configuré las variables de entorno correctas en 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)

sin embargo, todavía recibía el error y luego simplemente copié stubs-32.hdonde gcc esperaba encontrarlo después de hacer una rápida diferencia:

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$

Se está compilando ahora, veamos si se queja más ...


Impar. Ese paquete está definitivamente disponible en 12.04 (Preciso), ver paquetes.ubuntu.com/precise/libc6-dev-i386
Timothy Jones

0

FWIW, huele a un error (o al menos una fuente potencial de dolor futuro) al usar archivos de / usr / include cuando se realiza una compilación cruzada.


1
Creo que él está tratando de construir la cadena de herramientas, no compilar con esos incluidos.
Keith Layne

0

gnu/stubs-32.hno está dirigido incluido en los programas. Es un archivo de encabezado de tipo back-end de gnu/stubs.h, al igual que gnu/stubs-64.h. Puede instalar el multilibpaquete para agregar ambos.


0

# sudo apt-get install g ++ - multilib

Debería solucionar este error en máquinas de 64 bits (Debian / Ubuntu).


0

Si enfrenta este problema en el terminal Mac-OSX con python, intente actualizar las versiones de los paquetes que está utilizando. Entonces, vaya a sus archivos en Python y donde especificó los paquetes, actualícelos a las últimas versiones disponibles en Internet.


0

En el uso de Debian / Ubuntu:

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.