J'essaie d'installer des nachos sur mon ordinateur portable et Ubuntu 11.04 est installé sur l'ordinateur portable.
Le code est en C et donc pour le construire, je suppose qu'il me faudra un compilateur croisé. C'est où mon problème est. J'ai téléchargé le code source du compilateur croisé MIPS à l'aide de 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 bon, mais quand j'essaie de construire le code source de l'OS 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 correctement sauf lorsque j'essaie d'utiliser faire.
Vous manquez le paquet dev libc 32 bits:
Sur Ubuntu , il s’appelle libc6-dev-i386 - do Sudo apt-get install libc6-dev-i386
. Voir ci-dessous des instructions supplémentaires pour Ubuntu 12.04.
Sur Red Hat , le nom du paquet est glibc-devel.i686
(Merci au commentaire de David Gardner).
Sur CentOS 5.8 , le nom du paquet est glibc-devel.i386
(grâce au commentaire de JimKleck).
Sur CentOS 6/7 , le nom du paquet est glibc-devel.i686
.
Le SLES s'appelle glibc-devel-32bit - do zypper in glibc-devel-32bit
.
Sur Gentoo on l’appelle sys-libs/glibc
- do emerge -1a sys-libs/gcc
[ source ] (Note: on peut utiliser equery
pour confirmer que cela est correct; faites equery belongs belongs /usr/include/gnu/stubs-32.h
)
Sur ArchLinux , le nom du paquet est lib32-glibc
- do pacman -S lib32-glibc
.
Utilisez-vous Ubuntu 12.04 ? Il y a n problème connu qui place les fichiers dans un emplacement non standard . Vous aurez aussi besoin de 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 (par exemple, dans votre .bashrc).
Si vous compilez également du code C++, vous aurez également besoin de la bibliothèque 32 bits stdc ++. 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 faire yum install libstdc++-devel.i386
Sur CentOS 6 , vous devrez faire yum install libstdc++-devel.i686
S'il vous plaît, n'hésitez pas à éditer les packages pour d'autres systèmes.
Depuis le site web GNU UPC :
La compilation du compilateur échoue avec l'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 fonctionnalité GCC/UPC multilib est activée et indique que la version 32 bits de libc n'est pas installée. Il y a deux façons de corriger ce problème:
- Installez la version 32 bits de glibc (par exemple, glibc-devel.i686 sur Fedora, CentOS, ..)
- Désactivez la construction 'multilib' en fournissant le commutateur "--disable-multilib" à la commande de configuration du compilateur
Essayez de faire un Sudo apt-get install libc6-dev
.
apt-file
me dit que le fichier en question appartient à ce paquet.
Ceci est maintenant dans la FAQ du wiki GCC, voir http://gcc.gnu.org/wiki/FAQ#gnu_stubs-32.h
Je recevais 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 fichiers ou de répertoires de ce type 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 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: error : ld a renvoyé 1 état de sortie
Solution:
J'ai installé (yum install) glibc.i686, glibc-devel.i386 et libgcc.i686 pour résoudre le problème de la compilation.
Maintenant, la compilation pour 32 bits (-m32) fonctionne bien.
Hmm, je suis sur Ubuntu 12.04 et j'ai la même erreur en essayant de compiler gcc 4.7.2
J'ai essayé d'installer le paquetage libc6-dev-i386
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 aussi 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, je continuais à avoir l'erreur alors j'ai simplement copié stubs-32.h
vers l'endroit où gcc s'attendait à la trouver après avoir effectué un rapide 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$
C'est la compilation maintenant, voyons si ça se plaint plus ...
Si vous rencontrez ce problème dans un terminal Mac-OSX avec Python, essayez de mettre à jour les versions des packages que vous utilisez. Accédez donc à vos fichiers dans python et aux emplacements spécifiés, mettez-les à jour avec les dernières versions disponibles sur Internet.
gnu/stubs-32.h
n'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 package multilib
pour ajouter les deux.
# Sudo apt-get install g ++ - multilib
Devrait corriger cette erreur sur les machines 64 bits (Debian/Ubuntu).
FWIW, utiliser des fichiers de/usr/include lors de la compilation croisée a le sens d’une erreur (ou au moins d’une source potentielle de problèmes futurs).