Помилка “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 ++ collection2: ld повернув 1 статус виходу make: *** [nachos] Помилка 1 будь-які ідеї, як виправити це? Що мені робити з цього приводу?
Ashish Agarwal

Відповіді:


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-файл - я про це не знав :)
Тімоті Джонс

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 multilib, і вона вказує, що 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
Як це зробити із системою виготовлення на основі автокону. Я спробував пройти --disable-multilib, але це нічого не змінило. У мене немає кореневого доступу для встановлення пакету multilib.
користувач632657

9

Спробуйте зробити sudo apt-get install libc6-dev.

apt-file говорить мені, що відповідний файл належить до цього пакету.


Дякую за вашу відповідь, це дуже допомогло: D
Ashish Agarwal

Цього недостатньо для багатошарової машини, оскільки ви все одно отримаєте цю помилку, навіть якщо у вас встановлена ​​остання версія 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 collection2: помилка : 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 і там, де ви вказали пакунки, оновіть їх до останніх версій, доступних в Інтернеті.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.