Error gnu / stub-32.h: Không có tệp hoặc thư mục nào như vậy trong khi biên dịch mã nguồn Nachos


170

Tôi đang cố gắng cài đặt Nachos trên máy tính xách tay của mình và tôi có Ubuntu 11.04 trên máy tính xách tay.

Mã này nằm trong C và vì vậy để xây dựng nó, tôi giả sử tôi sẽ cần trình biên dịch chéo. Đây là vấn đề của tôi. Tôi đã tải xuống mã nguồn của trình biên dịch chéo MIPS bằng lệnh

  wget http://mll.csie.ntu.edu.tw/course/os_f08/assignment/mips-decstation.linux-xgcc.gz

và tôi đã giải nén nó bằng cách sử dụng

tar zxvf mips-decstation.linux-xgcc.gz      

Điều này không sao, nhưng khi tôi cố gắng xây dựng mã nguồn của hệ điều hành nachos, sử dụng make, tôi gặp lỗi này -

/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

Tôi đang cố gắng làm theo các hướng dẫn được đưa ra ở đây - http://mll.csie.ntu.edu.tw/c thuyết / os_f08/217.htm và mọi thứ đều hoạt động tốt trừ khi tôi cố gắng sử dụng make.


1
Cảm ơn bạn đã góp ý, chương trình bắt đầu biên dịch nhưng tôi gặp lỗi này _ Xin chào, bây giờ tôi có lỗi này - / usr / bin / ld: bỏ qua không tương thích / usr / lib / x86_64-linux-gnu / gcc / x86_64- linux-gnu / 4.5.2 / libstdc ++. a khi tìm kiếm -lstdc ++ / usr / bin / ld: không thể tìm thấy -lstdc ++ coll2: ld trả về 1 trạng thái thoát thực hiện: *** [nachos] Lỗi 1 bất kỳ ý tưởng nào về cách khắc phục điều này ? Tôi nên làm gì với cái này ?
Ashish Agarwal

Câu trả lời:


351

Bạn đang thiếu gói libc 32 bit:

Trên Ubuntu, nó được gọi là libc6-dev-i386 - do sudo apt-get install libc6-dev-i386. Xem bên dưới để biết thêm hướng dẫn cho Ubuntu 12.04.

Trên các bản phân phối của Red Hat , tên gói là glibc-devel.i686(Nhờ nhận xét của David Gardner).

Trên CentOS 5.8 , tên gói là glibc-devel.i386(Cảm ơn bình luận của JimKleck).

Trên CentOS 6/7 , tên gói là glibc-devel.i686.

Trên SLES, nó được gọi là glibc-devel-32bit - do zypper in glibc-devel-32bit.

Trên Gentoo, nó được gọi là sys-libs/glibc- do emerge -1a sys-libs/gcc [ source ] (Lưu ý: Người ta có thể sử dụng equeryđể xác nhận điều này là đúng; do equery belongs belongs /usr/include/gnu/stubs-32.h)

Trên ArchLinux , tên gói là lib32-glibc- do pacman -S lib32-glibc.


Bạn đang sử dụng Ubuntu 12.04 ? Có một vấn đề được biết là đặt các tệp ở một vị trí không chuẩn . Bạn cũng cần phải làm:

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)

ở đâu đó trước khi bạn xây dựng (nói trong .bashrc của bạn).


Nếu bạn cũng đang biên dịch mã C ++, bạn cũng sẽ cần thư viện stdc ++ 32 bit. Nếu bạn thấy cảnh báo này:

.... / usr / bin / ld: không thể tìm thấy -lstdc ++ ....

Trên Ubuntu bạn sẽ cần phải làm sudo apt-get install g++-multilib

Trên CentOS 5 bạn sẽ cần phải làmyum install libstdc++-devel.i386

Trên CentOS 6, bạn sẽ cần phải làmyum install libstdc++-devel.i686

Xin vui lòng chỉnh sửa trong các gói cho các hệ thống khác.


2
Có lẽ lý do tôi không tìm thấy gói đó là vì máy tính xách tay của tôi có 32 bit ... Tuy nhiên tôi đã tìm thấy libc-dev-amd64. Lỗi của tôi.
Keith Layne

1
Vâng, tôi có thể nói rằng anh ta có lẽ trên một máy 64 bit, đó là lý do tại sao tệp bị thiếu. Trên máy 64 bit của tôi, stub.h (mà anh ta có) nằm ở libc6-dev, trong khi stub-32.h (mà anh ta không có) nằm ở libc6-dev-i386. Mẹo hay về apt-file - Tôi không biết về nó :)
Timothy Jones

8
Bạn có thể chọn phiên bản 32 bit của thư viện đó bằng mộtsudo apt-get install g++-multilib
Timothy Jones

1
Đối với những người gặp phải điều này trên các bản phát hành dựa trên Red Hat, gói là glibc-devel.i686 (Tôi vừa làm và câu trả lời này rất hữu ích vì đã chỉ cho tôi đi đúng hướng :)
David Gardner

2
Có một vấn đề đã biết trên Ubuntu 12.04 đặt tệp này vào một thư mục không chuẩn sau khi cài đặt. Giải pháp này đã làm việc cho tôi vào cuối gcc.gnu.org/ml/gcc/2012-02/msg00314.html .
Eric Chen

55

Từ trang web GNU UPC :

Trình biên dịch không thành công với lỗi nghiêm trọng: gnu / stub-32.h: Không có tệp hoặc thư mục như vậy

Thông báo lỗi này hiển thị trên các hệ thống 64 bit có bật tính năng đa cấp GCC / UPC và thông báo rằng phiên bản libc 32 bit chưa được cài đặt. Có hai cách để khắc phục vấn đề này:

  • Cài đặt phiên bản glibc 32 bit (ví dụ: glibc-devel.i686 trên Fedora, CentOS, ..)
  • Vô hiệu hóa bản dựng 'multilib' bằng cách cung cấp công tắc "--disable-multilib" trên lệnh cấu hình trình biên dịch

8
cảm ơn bạn vì một câu trả lời đặc biệt hữu ích: --disable-multilibphần
necromancer

3
@ djhaskin987, gccupc.org không phải là nguồn, gcc.gnu.org là
Jonathan Wakely

Tôi đã 'cài đặt glibc-devel.i686' trên x64 centos 6.4
plhn

1
Làm thế nào để bạn làm điều này với một hệ thống tạo dựa trên autoconf? Tôi đã thử vượt qua --disable-multilib, nhưng nó không thay đổi gì cả. Tôi không có quyền truy cập root để cài đặt gói multilib.
dùng632657

9

Hãy thử làm một sudo apt-get install libc6-dev.

apt-file cho tôi biết rằng tập tin trong câu hỏi thuộc về gói đó.


Cảm ơn câu trả lời của bạn, nó đã giúp rất nhiều: D
Ashish Agarwal

Điều này là không đủ trên máy multiarch vì bạn vẫn sẽ gặp lỗi này ngay cả khi bạn đã cài đặt phiên bản libc6-dev mới nhất.
jeremiah


2

Tôi đã nhận được lỗi sau trên hộp fedora 18:


1. /usr/include/gnu/stub.h:7:27: lỗi nghiêm trọng: gnu / stub-32.h: Không có quá trình biên dịch tệp hoặc thư mục như vậy bị chấm dứt.

Tôi đã cài đặt glibc.i686 và glibc-devel.i686, sau đó quá trình biên dịch không thành công với lỗi sau:

2. / usr / bin / ld: bỏ qua /usr/lib/gcc/x86_64-redhat-linux/4.7.2/libgcc_s.so khi tìm kiếm -lgcc_s / usr / bin / ld: không thể tìm thấy : LD trở về 1 trạng thái thoát

Giải pháp:

Tôi đã cài đặt (yum install) glibc.i686 glibc-devel.i386 và libgcc.i686 để thoát khỏi vấn đề biên dịch.

Bây giờ quá trình biên dịch cho 32 bit (-m32) hoạt động tốt.


1

Hmm, tôi đang dùng Ubuntu 12.04 và tôi cũng gặp lỗi tương tự khi cố gắng biên dịch gcc 4.7.2

Tôi đã thử cài đặt libc6-dev-i386gói và nhận được như sau:

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

Tôi cũng đặt các biến môi trường chính xác trong 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)

tuy nhiên, tôi vẫn nhận được lỗi sau đó tôi chỉ đơn giản là sao chép stubs-32.hvào nơi gcc đang mong đợi tìm thấy nó sau khi thực hiện tìm khác biệt nhanh:

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$

Bây giờ nó đang được biên dịch, hãy xem nếu nó phàn nàn nhiều hơn ...


Lạ Gói đó chắc chắn có sẵn trong 12.04 (Chính xác) xem các
Timothy Jones

0

FWIW, nó có mùi giống như một lỗi (hoặc ít nhất là một nguồn đau tiềm ẩn trong tương lai) khi sử dụng các tệp từ / usr / bao gồm khi biên dịch chéo.


1
Tôi nghĩ rằng anh ta đang cố gắng xây dựng chuỗi công cụ, chứ không phải biên dịch chéo với những thứ bao gồm.
Keith Layne

0

gnu/stubs-32.hkhông được hướng dẫn trong các chương trình. Đây là một tệp tiêu đề loại back-end gnu/stubs.h, giống như gnu/stubs-64.h. Bạn có thể cài đặt multilibgói để thêm cả hai.


0

# sudo apt-get cài đặt g ++ - multilib

Nên sửa lỗi này trên các máy 64 bit (Debian / Ubuntu).


0

Nếu bạn đang gặp vấn đề này trong thiết bị đầu cuối Mac-OSX với python, hãy thử cập nhật các phiên bản của các gói bạn đang sử dụng. Vì vậy, hãy truy cập các tệp của bạn bằng python và nơi bạn đã chỉ định các gói, cập nhật chúng lên các phiên bản mới nhất có sẵn trên internet.


0

Trên Debian / Ubuntu sử dụng:

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.