Я пытаюсь установить 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.
Вам не хватает 32-битного пакета libc dev:
В Ubuntu он называется libc6-dev-i386 - do 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 - do zypper in glibc-devel-32bit
Используете ли вы 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).
Если вы также компилируете код на С++, вам также понадобится 32-битная библиотека stdС++. Если вы видите это предупреждение:
..../usr/bin/ld: не удается найти -lstdС++....
В Ubuntu вам нужно будет сделать sudo apt-get install g++-multilib
В CentOS 5 вам нужно будет сделать yum install libstdc++-devel.i386
В CentOS 6 вам нужно будет сделать yum install libstdc++-devel.i686
Пожалуйста, не стесняйтесь редактировать в пакетах для других систем.
libc-dev-amd64
. Виноват.
На веб-сайте GNU UPC:
Ошибка сборки компилятора с фатальной ошибкой: gnu/stubs-32.h: Нет такого файла или Каталог
Это сообщение об ошибке появляется в 64-битных системах, где GCC/UPC функция multilib включена, и это указывает на то, что 32-битная версия libc не установлен. Есть два способа исправить эту проблему:
- Установите 32-разрядную версию glibc (например, glibc-devel.i686 на Fedora, CentOS,..)
- Отключить сборку "multilib", предоставив "--disable-multilib" включить команду конфигурации компилятора
--disable-multilib
Попробуйте выполнить sudo apt-get install libc6-dev
.
apt-file
сообщает мне, что этот файл принадлежит этому пакету.
Это сейчас в разделе "Вопросы по вики-ссылке GCC", см. http://gcc.gnu.org/wiki/FAQ#gnu_stubs-32.h
Я получал следующую ошибку в поле 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) работает отлично.
Хмм, я нахожусь на 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$
Теперь он компилируется, давайте посмотрим, больше ли он жалуется...
# sudo apt-get install g++ - multilib
Должна исправить эту ошибку на 64-разрядных машинах (Debian/Ubuntu).
gnu/stubs-32.h
не включен в программы. Это заголовочный файл заголовка gnu/stubs.h
, как и gnu/stubs-64.h
. Вы можете установить пакет multilib
, чтобы добавить оба.
FWIW, он пахнет ошибкой (или, по крайней мере, потенциальным источником будущей боли), чтобы использовать файлы из /usr/include при кросс-компиляции.