Błąd „gnu / stubs-32.h: nie ma takiego pliku lub katalogu” podczas kompilowania kodu źródłowego Nachos

170

Próbuję zainstalować Nachos na moim laptopie i mam na nim Ubuntu 11.04.

Kod jest w C, więc aby go zbudować, zakładam, że będę potrzebował kompilatora krzyżowego. Tu jest mój problem. Pobrałem kod źródłowy kompilatora krzyżowego MIPS za pomocą polecenia

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

i rozpakowałem go za pomocą

tar zxvf mips-decstation.linux-xgcc.gz      

To jest w porządku, ale kiedy próbuję zbudować kod źródłowy nachos os przy użyciu make, pojawia się ten błąd -

/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

Próbuję postępować zgodnie z instrukcjami podanymi tutaj - http://mll.csie.ntu.edu.tw/course/os_f08/217.htm i wszystko działa dobrze, z wyjątkiem sytuacji, gdy próbuję użyć make.

Ashish Agarwal
źródło
1
Dziękuję za sugestie, program zaczyna się teraz kompilować, ale pojawia się ten błąd _ Cześć, teraz mam ten błąd - / usr / bin / ld: pomijam niezgodne / usr / lib / x86_64-linux-gnu / gcc / x86_64- linux-gnu / 4.5.2 / libstdc ++. a podczas wyszukiwania -lstdc ++ / usr / bin / ld: nie można znaleźć -lstdc ++ collect2: ld zwróciło 1 status wyjścia make: *** [nachos] Błąd 1 wszelkie pomysły, jak naprawić to? Co mam z tym zrobić?
Ashish Agarwal,

Odpowiedzi:

352

Brakuje 32-bitowego pakietu libc dev:

W Ubuntu nazywa się libc6-dev-i386 - zrób sudo apt-get install libc6-dev-i386. Poniżej znajdują się dodatkowe instrukcje dotyczące Ubuntu 12.04.

W dystrybucjach Red Hat nazwa pakietu to glibc-devel.i686(dzięki komentarzowi Davida Gardnera).

W CentOS 5.8 nazwa pakietu to glibc-devel.i386(dzięki komentarzowi JimKlecka).

W CentOS 6/7 nazwa pakietu to glibc-devel.i686.

W SLES nazywa się to glibc-devel-32bit - do zypper in glibc-devel-32bit.

W Gentoo nazywa się sys-libs/glibc- wykonaj emerge -1a sys-libs/gcc [ źródło ] (Uwaga: można użyć, equeryaby potwierdzić, że jest to poprawne; zrób equery belongs belongs /usr/include/gnu/stubs-32.h)

W ArchLinux nazwa pakietu to lib32-glibc- do pacman -S lib32-glibc.


Czy używasz Ubuntu 12.04 ? Istnieje znany problem, który powoduje umieszczenie plików w niestandardowej lokalizacji . Musisz także :

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)

gdzieś przed budowaniem (powiedzmy w swoim .bashrc).


Jeśli kompilujesz również kod w C ++, będziesz potrzebować 32-bitowej biblioteki stdc ++. Jeśli zobaczysz to ostrzeżenie:

.... / usr / bin / ld: nie można znaleźć -lstdc ++ ....

W Ubuntu musisz to zrobić sudo apt-get install g++-multilib

Na CentOS 5 musisz to zrobićyum install libstdc++-devel.i386

W CentOS 6 musisz to zrobićyum install libstdc++-devel.i686

Zapraszamy do edycji w pakietach dla innych systemów.

Timothy Jones
źródło
2
Może powodem, dla którego nie znalazłem tego pakietu, jest to, że mój laptop jest 32-bitowy ... Jednak znalazłem libc-dev-amd64. Mój błąd.
Keith Layne,
1
Tak, powiedziałbym, że prawdopodobnie pracuje na komputerze 64-bitowym, dlatego brakuje pliku. Na mojej 64-bitowej maszynie stubs.h (który ma) znajduje się w libc6-dev, a stubs-32.h (którego nie ma) w libc6-dev-i386. Dobra wskazówka na temat apt-file - nie wiedziałem o tym :)
Timothy Jones
8
Możesz pobrać 32-bitową wersję tej biblioteki za pomocąsudo apt-get install g++-multilib
Timothy Jones,
1
Dla tych, którzy napotkają to w dystrybucjach opartych na Red Hat, pakiet to glibc-devel.i686 (właśnie to zrobiłem, a ta odpowiedź była pomocna we wskazaniu mi właściwego kierunku :)
David Gardner
2
W systemie Ubuntu 12.04 występuje znany problem polegający na umieszczeniu tego pliku w niestandardowym katalogu po instalacji. To rozwiązanie zadziałało w końcu gcc.gnu.org/ml/gcc/2012-02/msg00314.html .
Eric Chen
55

Ze strony GNU UPC :

Kompilator kończy się niepowodzeniem i powoduje błąd krytyczny: gnu / stubs-32.h: nie ma takiego pliku lub katalogu

Ten komunikat o błędzie pojawia się w systemach 64-bitowych, w których włączona jest funkcja multilib GCC / UPC i wskazuje, że 32-bitowa wersja libc nie jest zainstalowana. Istnieją dwa sposoby rozwiązania tego problemu:

  • Zainstaluj 32-bitową wersję glibc (np. Glibc-devel.i686 w Fedorze, CentOS itp.)
  • Wyłącz kompilację „multilib”, podając przełącznik „--disable-multilib” w poleceniu konfiguracji kompilatora
ignis
źródło
8
dziękuję za szczególnie przydatną odpowiedź: --disable-multilibczęść
nekromanta
3
@ djhaskin987, gccupc.org nie jest źródłem, gcc.gnu.org to
Jonathan Wakely
Zrobiłem „yum install glibc-devel.i686” na x64 centos 6.4
plhn
1
Jak to zrobić z systemem make opartym na autoconf? Próbowałem przekazać --disable-multilib, ale to niczego nie zmienia. Nie mam uprawnień administratora, aby zainstalować pakiet multilib.
user632657
9

Spróbuj zrobić sudo apt-get install libc6-dev.

apt-file informuje, że dany plik należy do tego pakietu.

Keith Layne
źródło
Dziękuję za odpowiedź, bardzo pomogła: D
Ashish Agarwal,
Nie jest to wystarczające na maszynie wielowarchowej, ponieważ nadal będziesz otrzymywać ten błąd, nawet jeśli masz zainstalowaną najnowszą wersję libc6-dev.
jeremiah
2

Otrzymałem następujący błąd na pudełku Fedory 18:


1. /usr/include/gnu/stubs.h:7:27: błąd krytyczny: gnu / stubs-32.h: Kompilacja takiego pliku lub katalogu nie została zakończona.

Zainstalowałem glibc.i686 i glibc-devel.i686, następnie kompilacja nie powiodła się i wystąpił następujący błąd:

2. / usr / bin / ld: pomijanie niezgodnych /usr/lib/gcc/x86_64-redhat-linux/4.7.2/libgcc_s.so podczas wyszukiwania -lgcc_s / usr / bin / ld: nie można znaleźć -lgcc_s collect2: błąd : ld zwrócił 1 kod wyjścia

Rozwiązanie:

Zainstalowałem (yum install) glibc.i686 glibc-devel.i386 i libgcc.i686, aby pozbyć się problemu z kompilacją.

Teraz kompilacja dla wersji 32-bitowej (-m32) działa dobrze.

user2223366
źródło
1

Hmm cóż, jestem na Ubuntu 12.04 i mam ten sam błąd podczas próby kompilacji gcc 4.7.2

Próbowałem zainstalować libc6-dev-i386pakiet i otrzymałem następujące informacje:

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

Ustawiłem również poprawne zmienne środowiskowe w 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)

jednak nadal otrzymywałem błąd, a następnie po prostu skopiowałem stubs-32.hdo miejsca, w którym gcc spodziewało się go znaleźć po wykonaniu szybkiego porównania:

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$

Kompiluje się teraz, zobaczmy, czy narzeka bardziej ...

Victor Parmar
źródło
Dziwny. Ten pakiet jest zdecydowanie dostępny w 12.04 (Precyzyjny) patrz packages.ubuntu.com/precise/libc6-dev-i386
Timothy Jones
0

FWIW, używanie plików z / usr / include podczas kompilacji krzyżowej pachnie błędem (lub przynajmniej potencjalnym źródłem przyszłego bólu).

user47559
źródło
1
Myślę, że próbuje zbudować łańcuch narzędzi, a nie kompilować go krzyżowo z tymi dołączeniami.
Keith Layne
0

gnu/stubs-32.hnie jest skierowany do programów. Jest to typ pliku nagłówka back-end z gnu/stubs.h, podobnie jak gnu/stubs-64.h. Możesz zainstalować multilibpakiet, aby dodać oba.

user2775212
źródło
0

# sudo apt-get install g ++ - multilib

Powinien naprawić ten błąd na maszynach 64-bitowych (Debian / Ubuntu).

skrishnakar
źródło
0

Jeśli napotykasz ten problem w terminalu Mac-OSX z pythonem, spróbuj zaktualizować wersje używanych pakietów. Więc przejdź do swoich plików w Pythonie i tam, gdzie określiłeś pakiety, zaktualizuj je do najnowszych wersji dostępnych w Internecie.

D.Bhatia
źródło
0

W systemie Debian / Ubuntu:

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

Keivan
źródło