Ошибка 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 с помощью 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: пропуск несовместимого / 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 - do emerge -1a sys-libs/gcc [источник ] (Примечание: можно использовать equery, чтобы подтвердить, что это правильно; сделать equery belongs belongs /usr/include/gnu/stubs-32.h)

В ArchLinux имя пакета lib32-glibc - do 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-файла - я не знал об этом :) - person Timothy Jones; 14.09.2011
comment
Привет, теперь у меня есть эта ошибка - / usr / bin / ld: пропуск несовместимого /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-битной-64-битной кросс-компиляцией (при создании 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, и указывает на то, что 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
Как это сделать с помощью make-системы на основе 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

Теперь это находится в FAQ wiki 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 ожидал найти ее после быстрого сравнения:

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 и там, где вы указали пакеты, обновите их до последних версий, доступных в Интернете.

person D.Bhatia    schedule 20.06.2018

В Debian / Ubuntu используйте:

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

person Keivan    schedule 08.07.2020