Erreur "gnu / stubs-32.h: aucun fichier ou répertoire de ce type" lors de la compilation du code source Nachos

170

J'essaie d'installer Nachos sur mon ordinateur portable et j'ai Ubuntu 11.04 sur l'ordinateur portable.

Le code est en C et donc pour le construire, je suppose que j'aurai besoin d'un compilateur croisé. C'est là que se situe mon problème. J'ai téléchargé le code source du compilateur croisé MIPS en utilisant la commande

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

et je l'ai décompressé en utilisant

tar zxvf mips-decstation.linux-xgcc.gz      

C'est correct, mais quand j'essaye de construire le code source du système d'exploitation nachos, en utilisant make, j'obtiens cette erreur -

/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

J'essaie de suivre les instructions données ici - http://mll.csie.ntu.edu.tw/course/os_f08/217.htm et tout fonctionne bien sauf lorsque j'essaye d'utiliser make.

Ashish Agarwal
la source
1
Merci pour vos suggestions, le programme commence maintenant à se compiler mais j'obtiens cette erreur _ Salut, maintenant j'ai cette erreur - / usr / bin / ld: ignorer incompatible / usr / lib / x86_64-linux-gnu / gcc / x86_64- linux-gnu / 4.5.2 / libstdc ++. a lors de la recherche de -lstdc ++ / usr / bin / ld: impossible de trouver -lstdc ++ collect2: ld a renvoyé 1 état de sortie make: *** [nachos] Erreur 1 des idées sur la façon de corriger ce ? Que dois-je faire à ce sujet?
Ashish Agarwal le

Réponses:

352

Il vous manque le package de développement libc 32 bits:

Sur Ubuntu, il s'appelle libc6-dev-i386 - do sudo apt-get install libc6-dev-i386. Voir ci-dessous pour des instructions supplémentaires pour Ubuntu 12.04.

Sur les distributions Red Hat , le nom du paquet est glibc-devel.i686(Merci au commentaire de David Gardner).

Sur CentOS 5.8 , le nom du package est glibc-devel.i386(Merci au commentaire de JimKleck).

Sur CentOS 6/7 , le nom du package est glibc-devel.i686.

Sur SLES, il s'appelle glibc-devel-32bit - do zypper in glibc-devel-32bit.

Sur Gentoo, il s'appelle sys-libs/glibc- do emerge -1a sys-libs/gcc [ source ] (Remarque: on peut utiliser equerypour confirmer que c'est correct; faire equery belongs belongs /usr/include/gnu/stubs-32.h)

Sur ArchLinux , le nom du package est lib32-glibc- do pacman -S lib32-glibc.


Utilisez-vous Ubuntu 12.04 ? Il existe un problème connu qui place les fichiers dans un emplacement non standard . Vous devrez également faire:

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)

quelque part avant de construire (disons dans votre .bashrc).


Si vous compilez également du code C ++, vous aurez également besoin de la bibliothèque stdc ++ 32 bits. Si vous voyez cet avertissement:

.... / usr / bin / ld: impossible de trouver -lstdc ++ ....

Sur Ubuntu, vous devrez faire sudo apt-get install g++-multilib

Sur CentOS 5, vous devrez faireyum install libstdc++-devel.i386

Sur CentOS 6, vous devrez faireyum install libstdc++-devel.i686

N'hésitez pas à modifier les packages pour d'autres systèmes.

Timothy Jones
la source
2
Peut-être que la raison pour laquelle je n'ai pas trouvé ce paquet est que mon ordinateur portable est 32 bits ... J'ai cependant trouvé libc-dev-amd64. Ma faute.
Keith Layne le
1
Ouais, je dirais qu'il est probablement sur une machine 64 bits, c'est pourquoi le fichier est manquant. Sur ma machine 64 bits, stubs.h (qu'il a) est dans la libc6-dev, tandis que stubs-32.h (ce qu'il ne fait pas) est dans la libc6-dev-i386. Bon conseil sur apt-file - Je ne savais pas à ce sujet :)
Timothy Jones
8
Vous pouvez récupérer la version 32 bits de cette bibliothèque avec unsudo apt-get install g++-multilib
Timothy Jones
1
Pour ceux qui rencontrent cela sur les distributions basées sur Red Hat, le paquet est glibc-devel.i686 (je viens de le faire et cette réponse a été utile pour m'indiquer dans la bonne direction :)
David Gardner
2
Il existe un problème connu sur Ubuntu 12.04 qui place ce fichier dans un répertoire non standard après l'installation. Cette solution a fonctionné pour moi à la fin gcc.gnu.org/ml/gcc/2012-02/msg00314.html .
Eric Chen
55

Sur le site Web de GNU UPC :

La construction du compilateur échoue avec une erreur fatale: gnu / stubs-32.h: aucun fichier ou répertoire de ce type

Ce message d'erreur apparaît sur les systèmes 64 bits où la fonction multilib GCC / UPC est activée, et il indique que la version 32 bits de la libc n'est pas installée. Il existe deux façons de corriger ce problème:

  • Installez la version 32 bits de la glibc (par exemple glibc-devel.i686 sur Fedora, CentOS, ..)
  • Désactivez la construction 'multilib' en fournissant le commutateur "--disable-multilib" sur la commande de configuration du compilateur
Ignis
la source
8
merci pour une réponse particulièrement utile: la --disable-multilibpartie
nécromancien
3
@ djhaskin987, gccupc.org n'est pas la source, gcc.gnu.org est
Jonathan Wakely
J'ai fait 'yum install glibc-devel.i686' sur x64 centos 6.4
plhn
1
Comment faites-vous cela avec un système make basé sur autoconf? J'ai essayé de passer --disable-multilib, mais cela ne change rien. Je n'ai pas d'accès root pour installer le package multilib.
user632657
9

Essayez de faire un sudo apt-get install libc6-dev.

apt-file me dit que le fichier en question appartient à ce package.

Keith Layne
la source
Merci pour votre réponse, cela a beaucoup aidé: D
Ashish Agarwal
Ce n'est pas suffisant sur une machine multi-arch, car vous obtiendrez toujours cette erreur même si vous avez la dernière version de libc6-dev installée.
jeremiah
2

J'obtenais l'erreur suivante sur une boîte fedora 18:


1. /usr/include/gnu/stubs.h:7:27: erreur fatale: gnu / stubs-32.h: aucune compilation de ce type de fichier ou de répertoire n'est terminée.

J'ai installé glibc.i686 et glibc-devel.i686, puis la compilation a échoué avec l'erreur suivante:

2. / usr / bin / ld: ignorer l'incompatible /usr/lib/gcc/x86_64-redhat-linux/4.7.2/libgcc_s.so lors de la recherche de -lgcc_s / usr / bin / ld: impossible de trouver -lgcc_s collect2: erreur : ld a renvoyé 1 statut de sortie

Solution:

J'ai installé (yum install) glibc.i686 glibc-devel.i386 et libgcc.i686 pour se débarrasser du problème de compilation.

Maintenant, la compilation pour 32 bits (-m32) fonctionne correctement.

user2223366
la source
1

Eh bien, je suis sur ubuntu 12.04 et j'ai eu cette même erreur en essayant de compiler gcc 4.7.2

J'ai essayé d'installer le libc6-dev-i386package et j'ai obtenu ce qui suit:

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

J'ai également défini les bonnes variables d'environnement dans 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)

cependant, j'obtenais toujours l'erreur, puis j'ai simplement copié stubs-32.hlà où gcc s'attendait à le trouver après avoir fait une comparaison rapide:

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$

Il est en train de compiler maintenant, voyons s'il se plaint plus ...

Victor Parmar
la source
Impair. Ce package est définitivement disponible en 12.04 (Precise) voir packages.ubuntu.com/precise/libc6-dev-i386
Timothy Jones
0

FWIW, cela sent comme une erreur (ou au moins une source potentielle de douleur future) d'utiliser des fichiers de / usr / include lors de la compilation croisée.

user47559
la source
1
Je pense qu'il essaie de construire la chaîne d'outils, pas de faire une compilation croisée avec ces inclusions.
Keith Layne
0

gnu/stubs-32.hn'est pas dirigé inclus dans les programmes. C'est un fichier d'en-tête de type back-end de gnu/stubs.h, tout comme gnu/stubs-64.h. Vous pouvez installer le multilibpackage pour ajouter les deux.

utilisateur2775212
la source
0

# sudo apt-get install g ++ - multilib

Devrait corriger cette erreur sur les machines 64 bits (Debian / Ubuntu).

skrishnakar
la source
0

Si vous rencontrez ce problème dans le terminal Mac-OSX avec python, essayez de mettre à jour les versions des packages que vous utilisez. Alors, allez dans vos fichiers en python et là où vous avez spécifié les packages, mettez-les à jour avec les dernières versions disponibles sur Internet.

D.Bhatia
la source
0

Sur l'utilisation de Debian / Ubuntu:

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

Keivan
la source