Fehler "gnu / stubs-32.h: Keine solche Datei oder kein solches Verzeichnis" beim Kompilieren des Nachos-Quellcodes


170

Ich versuche Nachos auf meinem Laptop zu installieren und habe Ubuntu 11.04 auf dem Laptop.

Der Code ist in C und um ihn zu erstellen, gehe ich davon aus, dass ich einen Cross-Compiler benötige. Hier liegt mein Problem. Ich habe den Quellcode des MIPS-Cross-Compilers mit dem Befehl heruntergeladen

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

und ich habe es mit entpackt

tar zxvf mips-decstation.linux-xgcc.gz      

Das ist in Ordnung, aber wenn ich versuche, den Quellcode des Nachos OS mit make zu erstellen, erhalte ich diesen Fehler -

/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

Ich versuche, den hier gegebenen Anweisungen zu folgen - http://mll.csie.ntu.edu.tw/course/os_f08/217.htm und alles funktioniert einwandfrei, außer wenn ich versuche, make zu verwenden.


1
Vielen Dank für Ihre Vorschläge, das Programm beginnt jetzt zu kompilieren, aber ich erhalte diesen Fehler _ Hallo, jetzt habe ich diesen Fehler - / usr / bin / ld: Überspringen von inkompatiblem / usr / lib / x86_64-linux-gnu / gcc / x86_64- linux-gnu / 4.5.2 / libstdc ++. a bei der Suche nach -lstdc ++ / usr / bin / ld: kann -lstdc nicht finden ++ collect2: ld hat 1 Exit-Status zurückgegeben make: *** [nachos] Fehler 1 Irgendwelche Ideen zur Behebung Dies ? Was soll ich dagegen tun?
Ashish Agarwal

Antworten:


351

Sie vermissen das 32-Bit-libc-Entwicklungspaket:

Unter Ubuntu heißt es libc6-dev-i386 - do sudo apt-get install libc6-dev-i386. Weitere Anweisungen für Ubuntu 12.04 finden Sie weiter unten.

In Red Hat- Distributionen lautet der Paketname glibc-devel.i686(Dank an David Gardners Kommentar).

Unter CentOS 5.8 lautet der Paketname glibc-devel.i386(dank JimKlecks Kommentar).

Unter CentOS 6/7 lautet der Paketname glibc-devel.i686.

Auf SLES heißt es glibc-devel-32bit - do zypper in glibc-devel-32bit.

Auf Gentoo heißt es sys-libs/glibc- do emerge -1a sys-libs/gcc [ Quelle ] (Hinweis: Man kann verwenden equery, um zu bestätigen, dass dies korrekt ist; do equery belongs belongs /usr/include/gnu/stubs-32.h)

Unter ArchLinux lautet der Paketname lib32-glibc- do pacman -S lib32-glibc.


Verwenden Sie Ubuntu 12.04 ? Es ist ein Problem bekannt, bei dem die Dateien an einem nicht standardmäßigen Speicherort abgelegt werden . Sie werden auch tun müssen:

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)

irgendwo vor dem Erstellen (etwa in Ihrer .bashrc).


Wenn Sie auch C ++ - Code kompilieren, benötigen Sie auch die 32-Bit-stdc ++ - Bibliothek. Wenn Sie diese Warnung sehen:

.... / usr / bin / ld: -lstdc ++ kann nicht gefunden werden ....

Unter Ubuntu müssen Sie dies tun sudo apt-get install g++-multilib

Unter CentOS 5 müssen Sie dies tunyum install libstdc++-devel.i386

Unter CentOS 6 müssen Sie dies tunyum install libstdc++-devel.i686

Bitte zögern Sie nicht, die Pakete für andere Systeme zu bearbeiten.


2
Vielleicht ist der Grund, warum ich dieses Paket nicht gefunden habe, dass mein Laptop 32 Bit ist ... ich habe es jedoch gefunden libc-dev-amd64. Mein Fehler.
Keith Layne

1
Ja, ich würde sagen, er befindet sich wahrscheinlich auf einem 64-Bit-Computer, weshalb die Datei fehlt. Auf meinem 64-Bit-Computer befindet sich stubs.h (das er hat) in libc6-dev, während stubs-32.h (das er nicht hat) in libc6-dev-i386. Guter Tipp über apt-file - ich wusste nichts davon :)
Timothy Jones

8
Sie können die 32-Bit-Version dieser Bibliothek mit einemsudo apt-get install g++-multilib
Timothy Jones

1
Für diejenigen, die dies auf Red Hat-basierten Distributionen antreffen, ist das Paket glibc-devel.i686 (Ich habe es gerade getan und diese Antwort war hilfreich, um mich in die richtige Richtung zu weisen :)
David Gardner

2
Unter Ubuntu 12.04 ist ein Problem bekannt, bei dem diese Datei nach der Installation in einem nicht standardmäßigen Verzeichnis abgelegt wird. Diese Lösung hat bei mir am Ende gcc.gnu.org/ml/gcc/2012-02/msg00314.html funktioniert .
Eric Chen

55

Von der GNU UPC-Website :

Der Compiler-Build schlägt mit einem schwerwiegenden Fehler fehl: gnu / stubs-32.h: Keine solche Datei oder kein solches Verzeichnis

Diese Fehlermeldung wird auf 64-Bit-Systemen angezeigt, auf denen die GCC / UPC-Multilib-Funktion aktiviert ist, und zeigt an, dass die 32-Bit-Version von libc nicht installiert ist. Es gibt zwei Möglichkeiten, um dieses Problem zu beheben:

  • Installieren Sie die 32-Bit-Version von glibc (z. B. glibc-devel.i686 unter Fedora, CentOS, ..)
  • Deaktivieren Sie die Erstellung von 'Multilib', indem Sie den Schalter "--disable-multilib" für den Compilerkonfigurationsbefehl angeben

8
Vielen Dank für eine besonders nützliche Antwort: der --disable-multilibTeil
Nekromant

3
@ djhaskin987, gccupc.org ist nicht die Quelle, gcc.gnu.org ist
Jonathan Wakely

Ich habe 'yum glibc-devel.i686' auf x64 centos 6.4 installiert
plhn

1
Wie macht man das mit einem autoconf-basierten make-System? Ich habe versucht, --disable-multilib zu übergeben, aber es ändert nichts. Ich habe keinen Root-Zugriff, um das Multilib-Paket zu installieren.
user632657

9

Versuchen Sie es mit einem sudo apt-get install libc6-dev.

apt-file sagt mir, dass die fragliche Datei zu diesem Paket gehört.


Vielen Dank für Ihre Antwort, es hat sehr geholfen: D
Ashish Agarwal

Dies ist auf einem Multiarch-Computer nicht ausreichend, da dieser Fehler auch dann weiterhin angezeigt wird, wenn Sie die neueste Version von libc6-dev installiert haben.
Jeremiah


2

Ich habe folgenden Fehler auf einer Fedora 18-Box erhalten:


1. /usr/include/gnu/stubs.h:7:27: Schwerwiegender Fehler: gnu / stubs-32.h: Keine solche Datei- oder Verzeichniskompilierung wurde beendet.

Ich habe glibc.i686 und glibc-devel.i686 installiert, dann ist die Kompilierung mit folgendem Fehler fehlgeschlagen:

2. / usr / bin / ld: Inkompatibel überspringen /usr/lib/gcc/x86_64-redhat-linux/4.7.2/libgcc_s.so bei der Suche nach -lgcc_s / usr / bin / ld: -lgcc_s collect2: Fehler kann nicht gefunden werden : ld hat 1 Exit-Status zurückgegeben

Lösung:

Ich habe glibc.i686 glibc-devel.i386 und libgcc.i686 installiert (yum install), um das Kompilierungsproblem zu beseitigen.

Jetzt funktioniert die Kompilierung für 32 Bit (-m32) einwandfrei.


1

Hmm, ich bin auf Ubuntu 12.04 und habe den gleichen Fehler beim Versuch, gcc 4.7.2 zu kompilieren

Ich habe versucht, das libc6-dev-i386Paket zu installieren und habe Folgendes erhalten:

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

Ich habe auch die richtigen Umgebungsvariablen in bash festgelegt:

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)

Ich bekam jedoch immer noch den Fehler, dann kopierte ich einfach dorthin stubs-32.h, wo gcc ihn nach einem kurzen Diff erwartet hatte:

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$

Es wird jetzt kompiliert, mal sehen, ob es sich mehr beschwert ...


Seltsam. Dieses Paket ist definitiv in 12.04 (genau) verfügbar, siehe packages.ubuntu.com/precise/libc6-dev-i386
Timothy Jones

0

FWIW, es riecht nach einem Fehler (oder zumindest einer potenziellen Quelle zukünftiger Schmerzen), Dateien aus / usr / include beim Cross-Compilieren zu verwenden.


1
Ich denke, dass er versucht, die Toolchain zu erstellen und nicht mit diesen Includes zu kompilieren.
Keith Layne

0

gnu/stubs-32.hist nicht in Programmen enthalten. Es ist eine Back-End-Header-Datei von gnu/stubs.h, genau wie gnu/stubs-64.h. Sie können das multilibPaket installieren , um beide hinzuzufügen.


0

# sudo apt-get install g ++ - Multilib

Sollte diesen Fehler auf 64-Bit-Computern (Debian / Ubuntu) beheben.


0

Wenn dieses Problem im Mac-OSX-Terminal mit Python auftritt, aktualisieren Sie die Versionen der von Ihnen verwendeten Pakete. Gehen Sie also zu Ihren Dateien in Python und aktualisieren Sie sie dort, wo Sie die Pakete angegeben haben, auf die neuesten Versionen, die im Internet verfügbar sind.


0

Unter Debian / Ubuntu verwenden Sie:

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.