Ошибка "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.
Ответы
Ответ 1
Вам не хватает 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 glibc-devel.i686
имя пакета - glibc-devel.i686
.
В SLES он называется glibc-devel-32bit - do zypper in glibc-devel-32bit
.
В Gentoo он называется sys-libs/glibc
- действительно emerge -1a sys-libs/gcc
[ source ] (Примечание: можно использовать 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-битная библиотека std C++. Если вы видите это предупреждение:
..../usr/bin/ld: не удается найти -lstd C++....
В Ubuntu вам нужно будет выполнить sudo apt-get install g++-multilib
На CentOS 5 вам нужно будет выполнить yum install libstdC++-devel.i386
На CentOS 6 вам нужно будет выполнить yum install libstdC++-devel.i686
Пожалуйста, не стесняйтесь редактировать в пакетах для других систем.
Ответ 2
На веб-сайте GNU UPC:
Ошибка сборки компилятора с фатальной ошибкой: gnu/stubs-32.h: Нет такого файла или Каталог
Это сообщение об ошибке появляется в 64-битных системах, где GCC/UPC функция multilib включена, и это указывает на то, что 32-битная версия libc не установлен. Есть два способа исправить эту проблему:
- Установите 32-разрядную версию glibc (например, glibc-devel.i686 на Fedora, CentOS,..)
- Отключить сборку "multilib", предоставив "--disable-multilib" включить команду конфигурации компилятора
Ответ 3
Попробуйте выполнить sudo apt-get install libc6-dev
.
apt-file
сообщает мне, что этот файл принадлежит этому пакету.
Ответ 4
Это сейчас в разделе "Вопросы по вики-ссылке GCC", см. http://gcc.gnu.org/wiki/FAQ#gnu_stubs-32.h
Ответ 5
Я получал следующую ошибку в поле 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/x 86_64-redhat-linux/4.7.2/libgcc_s.so при поиске -lgcc_s
/usr/bin/ld: не удается найти -lgcc_s
collect2: error: ld возвращен 1 статус выхода
Решение:
Я установил (yum install) glibc.i686 glibc-devel.i386 и libgcc.i686, чтобы избавиться от проблемы компиляции.
Теперь компиляция для 32-битного (-m32) работает отлично.
Ответ 6
Хмм, я нахожусь на 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:
[email protected]:/usr/include/i386-linux-gnu/gnu$ diff ../../gnu ./
Only in ./: stubs-32.h
Only in ../../gnu: stubs-64.h
[email protected]:/usr/include/i386-linux-gnu/gnu$ sudo cp stubs-32.h ../../gnu/
[sudo] password for vic:
[email protected]:/usr/include/i386-linux-gnu/gnu$ diff ../../gnu ./
Only in ../../gnu: stubs-64.h
[email protected]:/usr/include/i386-linux-gnu/gnu$
Теперь он компилируется, давайте посмотрим, больше ли он жалуется...
Ответ 7
FWIW, он пахнет ошибкой (или, по крайней мере, потенциальным источником будущей боли), чтобы использовать файлы из /usr/include при кросс-компиляции.
Ответ 8
gnu/stubs-32.h
не включен в программы. Это заголовочный файл заголовка gnu/stubs.h
, как и gnu/stubs-64.h
. Вы можете установить пакет multilib
, чтобы добавить оба.
Ответ 9
# sudo apt-get install g++ - multilib
Должна исправить эту ошибку на 64-разрядных машинах (Debian/Ubuntu).
Ответ 10
Если вы столкнулись с этой проблемой в терминале Mac-OSX с python, попробуйте обновить версии пакетов, которые вы используете. Итак, перейдите к своим файлам в Python и там, где вы указали пакеты, обновите их до последних версий, доступных в Интернете.