Ошибка «gnu / stubs-32.h: нет такого файла или каталога» при компиляции исходного кода Nachos

150

Я пытаюсь установить 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
    Спасибо за ваши предложения, программа теперь начинает компилироваться, но я получаю эту ошибку _ Привет, теперь у меня есть эта ошибка - / 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 любые идеи о том, как исправить этот ? Что мне с этим делать?
Теги:
gcc
cross-compiling
mips
nachos

9 ответов

280
Лучший ответ

Вам не хватает 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

Пожалуйста, не стесняйтесь редактировать в пакетах для других систем.

  • 2
    Возможно, причина, по которой я не нашел этот пакет, заключается в том, что мой ноутбук 32-разрядный ... Однако я нашел libc-dev-amd64 . Виноват.
  • 1
    Да, я бы сказал, что он, вероятно, на 64-битной машине, поэтому файл отсутствует. На моей 64-битной машине stubs.h (который у него есть) находится в libc6-dev, а stubs-32.h (которого у него нет) - в libc6-dev-i386. Хороший совет по поводу apt-файла - я не знал об этом :)
Показать ещё 16 комментариев
47

На веб-сайте GNU UPC:

Ошибка сборки компилятора с фатальной ошибкой: gnu/stubs-32.h: Нет такого файла или Каталог

Это сообщение об ошибке появляется в 64-битных системах, где GCC/UPC функция multilib включена, и это указывает на то, что 32-битная версия libc не установлен. Есть два способа исправить эту проблему:

  • Установите 32-разрядную версию glibc (например, glibc-devel.i686 на Fedora, CentOS,..)
  • Отключить сборку "multilib", предоставив "--disable-multilib" включить команду конфигурации компилятора
  • 8
    спасибо за особенно полезный ответ: часть --disable-multilib
  • 3
    @ djhaskin987, gccupc.org не является источником, gcc.gnu.org является
Показать ещё 2 комментария
10

Попробуйте выполнить sudo apt-get install libc6-dev.

apt-file сообщает мне, что этот файл принадлежит этому пакету.

  • 0
    Спасибо за ваш ответ, это очень помогло: D
  • 0
    Этого недостаточно на машине с несколькими архивами, так как вы все равно получите эту ошибку, даже если у вас установлена последняя версия libc6-dev.
Показать ещё 1 комментарий
6

Это сейчас в разделе "Вопросы по вики-ссылке GCC", см. http://gcc.gnu.org/wiki/FAQ#gnu_stubs-32.h

1

Я получал следующую ошибку в поле 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) работает отлично.

1

Хмм, я нахожусь на 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$

Теперь он компилируется, давайте посмотрим, больше ли он жалуется...

0

# sudo apt-get install g++ - multilib

Должна исправить эту ошибку на 64-разрядных машинах (Debian/Ubuntu).

0

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

0

FWIW, он пахнет ошибкой (или, по крайней мере, потенциальным источником будущей боли), чтобы использовать файлы из /usr/include при кросс-компиляции.

  • 1
    Я думаю, что он пытается создать цепочку инструментов, а не кросс-компилировать с этими включениями.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню