Грешка gnu/stubs-32.h: Няма такъв файл или директория при компилиране на изходния код на Nachos

Опитвам се да инсталирам Nachos на моя лаптоп и имам Ubuntu 11.04 на лаптопа.

Кодът е на C и затова, за да го създам, предполагам, че ще ми трябва кръстосан компилатор. Тук е проблемът ми. Изтеглих изходния код на кръстосания компилатор MIPS с помощта на командата

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

и го разархивирах с помощта на

tar zxvf mips-decstation.linux-xgcc.gz      

Това е добре, но когато се опитам да създам изходния код на nachos os, използвайки make, получавам тази грешка -

/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

Опитвам се да следвам инструкциите, дадени тук - http://mll.csie.ntu.edu.tw/course/os_f08/217.htm и всичко работи добре, освен когато се опитвам да използвам make.


person Ashish Agarwal    schedule 14.09.2011    source източник
comment
Благодаря ви за вашите предложения, програмата сега започва да се компилира, но получавам тази грешка _ Здравейте, сега имам тази грешка - /usr/bin/ld: skipping incompatible /usr/lib/x86_64-linux-gnu/gcc/x86_64- linux-gnu/4.5.2/libstdc++.a при търсене на -lstdc++ /usr/bin/ld: не може да намери -lstdc++ collect2: ld върна 1 изходен статус make: *** [nachos] Грешка 1 някакви идеи как да се коригира това ? Какво трябва да направя по въпроса?   -  person Ashish Agarwal    schedule 15.09.2011


Отговори (11)


Липсва ви 32-битовият libc dev пакет:

В Ubuntu се нарича libc6-dev-i386 - направете sudo apt-get install libc6-dev-i386. Вижте по-долу за допълнителни инструкции за Ubuntu 12.04.

В дистрибуции на Red Hat името на пакета е glibc-devel.i686 (Благодарение на коментара на Дейвид Гарднър).

В CentOS 5.8 името на пакета е glibc-devel.i386 (Благодарение на коментара на JimKleck).

В CentOS 6 / 7 името на пакета е glibc-devel.i686.

На SLES се нарича glibc-devel-32bit - направете zypper in glibc-devel-32bit.

В Gentoo се нарича sys-libs/glibc - направете emerge -1a sys-libs/gcc [източник ] (Забележка: Може да се използва equery, за да се потвърди, че това е правилно; направете equery belongs belongs /usr/include/gnu/stubs-32.h)

В ArchLinux името на пакета е lib32-glibc - направете pacman -S lib32-glibc.


Използвате ли Ubuntu 12.04? Има известен проблем, който поставя файловете в нестандартно местоположение. Ще трябва също да направите:

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)

някъде преди да изградите (да речем във вашия .bashrc).


Ако също така компилирате C++ код, ще ви трябва и 32-битовата stdc++ библиотека. Ако видите това предупреждение:

.... /usr/bin/ld: не може да намери -lstdc++ ....

В Ubuntu ще трябва да направите sudo apt-get install g++-multilib

В CentOS 5 ще трябва да направите yum install libstdc++-devel.i386

В CentOS 6 ще трябва да направите yum install libstdc++-devel.i686

Моля, не се колебайте да редактирате в пакетите за други системи.

person Timothy Jones    schedule 14.09.2011
comment
Може би причината, поради която не намерих този пакет, е, че лаптопът ми е 32-битов... но намерих libc-dev-amd64. Моя грешка. - person Keith Layne; 14.09.2011
comment
Да, бих казал, че вероятно е на 64-битова машина, поради което файлът липсва. На моята 64-битова машина stubs.h (което той има) е в libc6-dev, докато stubs-32.h (което той няма) е в libc6-dev-i386. Добър съвет за apt-file - не знаех за него :) - person Timothy Jones; 14.09.2011
comment
Здравейте, сега имам тази грешка - /usr/bin/ld: skipping incompatible /usr/lib/x86_64-linux-gnu/gcc/x86_64-linux-gnu/4.5.2/libstdc++.a при търсене на -lstdc++ /usr /bin/ld: не може да намери -lstdc++ collect2: ld върна 1 състояние на изход make: *** [nachos] Грешка 1 някакви идеи как да поправя това? - person Ashish Agarwal; 15.09.2011
comment
Можете да вземете 32-битовата версия на тази библиотека с sudo apt-get install g++-multilib - person Timothy Jones; 15.09.2011
comment
За тези, които се сблъскват с това в дистрибуции, базирани на Red Hat, пакетът е glibc-devel.i686 (току-що го направих и този отговор беше полезен, за да ме насочи в правилната посока :) - person David Gardner; 23.07.2012
comment
За моята система, работеща с CentOS 5.8, името на пакета е glibc-devel.i386. Също така имах проблеми с 32-битово кръстосано компилиране (при изграждането на valgrind за работа на 64-битова машина при анализиране на 32-битов изпълним файл). Благодаря на Ашсис, че зададе въпроса по начин, по който получи отговор, на Тимъти за отговора и накрая на Дейвид за подсказката как да намерим правилното име на пакета. - person JimKleck; 23.07.2012
comment
Благодаря на всички. Редактирах библиотеките, които споменахте в отговора. И благодаря за всички ваши благодарности ;) - person Timothy Jones; 24.07.2012
comment
Има известен проблем на Ubuntu 12.04, който поставя този файл в нестандартна директория след инсталиране. Това решение работи за мен в крайна сметка gcc.gnu.org/ml/ gcc/2012-02/msg00314.html. - person Eric Chen; 20.09.2012
comment
Благодаря @e_x_p. Добавих тези допълнителни инструкции. - person Timothy Jones; 10.10.2012
comment
Тук съветват да използвате /usr/blah/$(gcc -print-multiarch) вместо това. - person ignis; 21.01.2013
comment
Благодаря @ignis, добавих това към отговора. - person Timothy Jones; 31.01.2013
comment
на fedora 19 вместо това трябваше да инсталирам glibc-devel.i686 (i686 срещу i386). - person Emmanuel M. Smith; 20.09.2013
comment
Ами ако не сте су на вашата машина? - person Bernhard; 27.02.2014
comment
За да избегнете грешка в линкера, ще ви е необходим и 32-битов libgcc (libgcc.i686 на fedora) - person toasted_flakes; 25.07.2014
comment
така че не е ли така, че OP просто ще трябва да насочи инсталацията да използва 64-битовата версия на мъничетата, която вече е налице? OP трябва да инсталира 32-битовата версия, въпреки че инсталацията (потенциално) се извършва на 64-битова машина? - person dbliss; 11.10.2015

От уебсайта на GNU UPC:

Компилаторът е неуспешен с фатална грешка: gnu/stubs-32.h: Няма такъв файл или директория

Това съобщение за грешка се показва на 64-битовите системи, където GCC/UPC функцията multilib е активирана, и показва, че 32-битовата версия на libc не е инсталирана. Има два начина за коригиране на този проблем:

  • Инсталирайте 32-битова версия на glibc (напр. glibc-devel.i686 на Fedora, CentOS, ..)
  • Деактивирайте изграждането на 'multilib', като предоставите ключ "--disable-multilib" в командата за конфигуриране на компилатора
person ignis    schedule 21.01.2013
comment
благодаря ви за особено полезния отговор: частта --disable-multilib - person necromancer; 02.05.2013
comment
@djhaskin987, gccupc.org не е източникът, gcc.gnu.org е - person Jonathan Wakely; 05.09.2013
comment
Направих „yum install glibc-devel.i686“ на x64 centos 6.4 - person plhn; 16.10.2013
comment
Как се прави това със система за създаване, базирана на autoconf? Опитах да предам --disable-multilib, но това не променя нищо. Нямам root достъп, за да инсталирам пакета multilib. - person user632657; 25.02.2014

Опитайте да направите sudo apt-get install libc6-dev.

apt-file ми казва, че въпросният файл принадлежи към този пакет.

person Keith Layne    schedule 14.09.2011
comment
Благодаря за отговора, помогна много :D - person Ashish Agarwal; 15.09.2011
comment
Това не е достатъчно на многоархивна машина, тъй като пак ще получите тази грешка, дори ако имате инсталирана най-новата версия на libc6-dev. - person jeremiah; 20.03.2012

Това вече е в често задаваните въпроси за уикито на GCC, вижте http://gcc.gnu.org/wiki/FAQ#gnu_stubs-32.h

person Jonathan Wakely    schedule 05.09.2013

Хм добре, аз съм на ubuntu 12.04 и получих същата грешка при опит да компилирам gcc 4.7.2

Опитах да инсталирам пакета libc6-dev-i386 и получих следното:

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

Също така зададох правилните променливи на средата в 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)

въпреки това все още получавах грешката, след което просто копирах stubs-32.h там, където gcc очакваше да го намери, след като направих бърз 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$

Сега се компилира, да видим дали ще се оплаква повече ...

person Victor Parmar    schedule 20.02.2013
comment
Странно. Този пакет определено е наличен в 12.04 (Precise) вижте packages.ubuntu.com/precise/libc6 -dev-i386 - person Timothy Jones; 27.03.2013
comment
Сблъсках се с този проблем, докато работех на VS Code в linux. Добавянето на /usr/include/x86_64-linux-gnu към масива includePath на файла c_cpp_properties.json работи перфектно за мен. Благодарение на вашия отговор открих местоположението на този файл. - person Sahin; 29.12.2020

Получавах следната грешка на кутия с fedora 18:


1. /usr/include/gnu/stubs.h:7:27: фатална грешка: gnu/stubs-32.h: Компилацията на такъв файл или директория не е прекратена.

Инсталирах glibc.i686 и glibc-devel.i686, след което компилацията се провали със следната грешка:

2. /usr/bin/ld: пропускане на несъвместими /usr/lib/gcc/x86_64-redhat-linux/4.7.2/libgcc_s.so при търсене на -lgcc_s /usr/bin/ld: не може да се намери -lgcc_s collect2: грешка : ld върна 1 изходен статус

Решение:

Инсталирах (yum install) glibc.i686 glibc-devel.i386 и libgcc.i686, за да се отърва от проблема с компилацията.

Сега компилацията за 32 бита (-m32) работи добре.

person user2223366    schedule 29.03.2013

FWIW, мирише на грешка (или поне на потенциален източник на бъдеща болка) използването на файлове от /usr/include при кръстосано компилиране.

person user47559    schedule 14.09.2011
comment
Мисля, че той се опитва да изгради инструменталната верига, а не да компилира кръстосано с тези включвания. - person Keith Layne; 15.09.2011

gnu/stubs-32.h не е включен в програмите. Това е заглавен файл от бек-енд тип на gnu/stubs.h, точно като gnu/stubs-64.h. Можете да инсталирате пакета multilib, за да добавите и двете.

person user2775212    schedule 13.09.2013

# sudo apt-get install g++-multilib

Трябва да коригира тази грешка на 64-битови машини (Debian/Ubuntu).

person skrishnakar    schedule 30.01.2015

Ако се сблъскате с този проблем в Mac-OSX терминал с python, опитайте да актуализирате версиите на пакетите, които използвате. Така че отидете на вашите файлове в python и където сте посочили пакетите, актуализирайте ги до най-новите версии, налични в интернет.

person D.Bhatia    schedule 20.06.2018

В Debian/Ubuntu използвайте:

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

person Keivan    schedule 08.07.2020