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


170

Я пытаюсь установить 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 есть идеи о том, как исправить этот ? Что мне с этим делать?
Ашиш Агарвал

Ответы:


352

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

На Gentoo это называется sys-libs/glibc- do emerge -1a sys-libs/gcc [ source ] (Примечание: можно использовать, equeryчтобы подтвердить, что это правильно; do equery belongs belongs /usr/include/gnu/stubs-32.h)

На ArchLinux имя пакета lib32-glibc- делать 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

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


2
Возможно, причина, по которой я не нашел этот пакет, заключается в том, что мой ноутбук 32-разрядный ... Однако я нашел libc-dev-amd64. Виноват.
Кейт Лэйн,

1
Да, я бы сказал, что он, вероятно, на 64-битной машине, поэтому файл отсутствует. На моей 64-битной машине stubs.h (который у него есть) находится в libc6-dev, а stubs-32.h (которого у него нет) - в libc6-dev-i386. Хороший совет по поводу apt-file - я не знал об этом :)
Тимоти Джонс

8
Вы можете получить 32-битную версию этой библиотеки сsudo apt-get install g++-multilib
Тимоти Джонс

1
Для тех, кто сталкивается с этим в дистрибутивах на основе Red Hat, пакет glibc-devel.i686 (я только что сделал, и этот ответ был полезен, чтобы указать мне правильное направление :)
Дэвид Гарднер

2
В Ubuntu 12.04 существует известная проблема, которая после установки помещает этот файл в нестандартный каталог. Это решение сработало для меня в конце gcc.gnu.org/ml/gcc/2012-02/msg00314.html .
Эрик Чен

55

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

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

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

  • Установите 32-битную версию glibc (например, glibc-devel.i686 на Fedora, CentOS, ..)
  • Отключите сборку 'multilib', указав переключатель "--disable-multilib" в команде конфигурации компилятора

8
спасибо за особенно полезный ответ: --disable-multilibчасть
некромант

3
@ djhaskin987, gccupc.org не является источником, gcc.gnu.org
Джонатан Уэйкли,

Я сделал 'yum install glibc-devel.i686' на x64 centos 6.4
plhn

1
Как вы делаете это с системой make на основе autoconf? Я пытался передать --disable-multilib, но это ничего не меняет. У меня нет прав root для установки пакета multilib.
user632657

9

Попробуйте делать sudo apt-get install libc6-dev.

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


Спасибо за ваш ответ, это очень помогло: D
Ашиш Агарвал

Этого недостаточно на машине с несколькими архивами, так как вы все равно получите эту ошибку, даже если у вас установлена ​​последняя версия libc6-dev.
Иеремия


2

Я получил следующую ошибку на коробке 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: 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 ожидал найти ее после выполнения быстрого сравнения:

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$

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


Странный. Этот пакет определенно доступен в 12.04 (Precise), см. Packages.ubuntu.com/precise/libc6-dev-i386
Тимоти Джонс,

0

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


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

0

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


0

# sudo apt-get install g ++ - multilib

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


0

Если вы столкнулись с этой проблемой в Mac-OSX-терминале с Python, попробуйте обновить версии пакетов, которые вы используете. Итак, перейдите к своим файлам в Python и там, где вы указали пакеты, обновите их до последних версий, доступных в Интернете.


0

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.