Ошибка "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 сообщает мне, что этот файл принадлежит этому пакету.

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