Erro “gnu / stubs-32.h: não existe esse arquivo ou diretório” ao compilar o código fonte do Nachos

170

Estou tentando instalar o Nachos no meu laptop e tenho o Ubuntu 11.04 no laptop.

O código está em C e, para construí-lo, presumo que precisarei de compilador cruzado. É aqui que está o meu problema. Eu baixei o código-fonte do MIPS Cross Compiler usando o comando

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

e eu descompactei-o usando

tar zxvf mips-decstation.linux-xgcc.gz      

Tudo bem, mas quando tento criar o código fonte do nachos os, usando make, recebo este erro -

/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

Estou tentando seguir as instruções fornecidas aqui - http://mll.csie.ntu.edu.tw/course/os_f08/217.htm e tudo está funcionando bem, exceto quando tento usar o make.

Ashish Agarwal
fonte
1
Obrigado por suas sugestões, o programa agora começa a compilar, mas recebo esse erro _ Oi, agora eu tenho esse erro - / usr / bin / ld: ignorando incompatível / usr / lib / x86_64-linux-gnu / gcc / x86_64- linux-gnu / 4.5.2 / libstdc ++. a ao procurar por -lstdc ++ / usr / bin / ld: não é possível encontrar -lstdc ++ collect2: ld retornou 1 status de saída make: *** [nachos] Erro 1 idéias sobre como corrigir esta ? O que devo fazer sobre isso ?
Ashish Agarwal

Respostas:

352

Está faltando o pacote libc dev de 32 bits:

No Ubuntu , é chamado libc6-dev-i386 - do sudo apt-get install libc6-dev-i386. Veja abaixo instruções adicionais para o Ubuntu 12.04.

Nas distribuições da Red Hat , o nome do pacote é glibc-devel.i686(Graças ao comentário de David Gardner).

No CentOS 5.8 , o nome do pacote é glibc-devel.i386(Graças ao comentário de JimKleck).

No CentOS 6/7 , o nome do pacote é glibc-devel.i686.

No SLES , é chamado glibc-devel-32bit - do zypper in glibc-devel-32bit.

No Gentoo é chamado sys-libs/glibc- do emerge -1a sys-libs/gcc [ source ] (Nota: pode-se usar equerypara confirmar que isso está correto; do equery belongs belongs /usr/include/gnu/stubs-32.h)

No ArchLinux , o nome do pacote é lib32-glibc- do pacman -S lib32-glibc.


Você está usando o Ubuntu 12.04 ? Há um problema conhecido que coloca os arquivos em um local não padrão . Você também precisará fazer:

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)

em algum lugar antes de criar (por exemplo, no seu .bashrc).


Se você também estiver compilando código C ++, também precisará da biblioteca stdc ++ de 32 bits. Se você vir este aviso:

.... / usr / bin / ld: não é possível encontrar -lstdc ++ ....

No Ubuntu, você precisará fazer sudo apt-get install g++-multilib

No CentOS 5, você precisará fazeryum install libstdc++-devel.i386

No CentOS 6, você precisará fazeryum install libstdc++-devel.i686

Por favor, sinta-se livre para editar os pacotes para outros sistemas.

Timothy Jones
fonte
2
Talvez a razão pela qual não encontrei esse pacote tenha sido o fato de meu laptop ter 32 bits ... No entanto, encontrei libc-dev-amd64. Foi mal.
perfil completo de Keith Layne
1
Sim, eu diria que ele provavelmente está em uma máquina de 64 bits, e é por isso que o arquivo está ausente. Na minha máquina de 64 bits, stubs.h (que ele possui) está na libc6-dev, enquanto stubs-32.h (que ele não possui) está na libc6-dev-i386. Boa dica sobre apt-file - Eu não sabia sobre isso :)
Timothy Jones
8
Você pode pegar a versão de 32 bits dessa biblioteca com umsudo apt-get install g++-multilib
Timothy Jones
1
Para aqueles que encontrar esse em distros baseadas em Red Hat, o pacote é glibc-devel.i686 (Eu apenas fiz e esta resposta foi útil para me apontar na direção certa :)
David Gardner
2
Há um problema conhecido no Ubuntu 12.04 que coloca esse arquivo em um diretório não padrão após a instalação. Esta solução funcionou para mim no final gcc.gnu.org/ml/gcc/2012-02/msg00314.html .
Eric Chen
55

No site da GNU UPC :

A compilação do compilador falha com erro fatal: gnu / stubs-32.h: esse arquivo ou diretório não existe

Esta mensagem de erro aparece nos sistemas de 64 bits em que o recurso multilib de GCC / UPC está ativado e indica que a versão de 32 bits da libc não está instalada. Há duas maneiras de corrigir esse problema:

  • Instale a versão de 32 bits do glibc (por exemplo, glibc-devel.i686 no Fedora, CentOS, ..)
  • Desative a compilação 'multilib' fornecendo a opção "--disable-multilib" no comando de configuração do compilador
ignis
fonte
8
obrigado por uma resposta particularmente útil: a --disable-multilibparte
necromante
3
@ djhaskin987, gccupc.org não é a fonte, gcc.gnu.org é #
Jonathan Wakely
Eu instalei o 'yum install glibc-devel.i686' no x64 centos 6.4
plhn 16/10/2013
1
Como você faz isso com um sistema make baseado em autoconf? Eu tentei passar --disable-multilib, mas isso não muda nada. Não tenho acesso root para instalar o pacote multilib.
user632657
9

Tente fazer um sudo apt-get install libc6-dev.

apt-file informa que o arquivo em questão pertence a esse pacote.

Keith Layne
fonte
Obrigado pela sua resposta, ele ajudou muito: D
Ashish Agarwal
Isso não é suficiente em uma máquina multiarch, pois você ainda receberá esse erro, mesmo que tenha a versão mais recente do libc6-dev instalada.
Jeremiah
2

Eu estava recebendo o seguinte erro em uma caixa do fedora 18:


1. /usr/include/gnu/stubs.h:7:27: erro fatal: gnu / stubs-32.h: Nenhuma compilação de arquivo ou diretório foi encerrada.

Eu instalei glibc.i686 e glibc-devel.i686 e a compilação falhou com o seguinte erro:

2. / usr / bin / ld: ignorando /usr/lib/gcc/x86_64-redhat-linux/4.7.2/libgcc_s.so incompatível ao procurar por -lgcc_s / usr / bin / ld: não é possível encontrar -lgcc_s collect2: erro : ld retornou 1 status de saída

Solução:

Eu instalei (yum install) glibc.i686 glibc-devel.i386 e libgcc.i686 para livrar-se do problema de compilação.

Agora a compilação para 32 bits (-m32) funciona bem.

user2223366
fonte
1

Hmm, estou no ubuntu 12.04 e recebi o mesmo erro ao tentar compilar o gcc 4.7.2

Tentei instalar o libc6-dev-i386pacote e obtive o seguinte:

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

Também defino as variáveis ​​de ambiente corretas no 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)

no entanto, eu ainda estava recebendo o erro e simplesmente copiei stubs-32.hpara onde o gcc esperava encontrá-lo depois de fazer uma rápida comparação:

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$

Está compilando agora, vamos ver se reclama mais ...

Victor Parmar
fonte
Ímpar. Esse pacote está definitivamente disponível no 12.04 (Precise), veja packages.ubuntu.com/precise/libc6-dev-i386
Timothy Jones
0

FWIW, parece um erro (ou pelo menos uma fonte potencial de dor futura) ao usar arquivos de / usr / include ao fazer a compilação cruzada.

user47559
fonte
1
Eu acho que ele está tentando construir o conjunto de ferramentas, não compilar de forma cruzada com esses inclusos.
Keith Layne
0

gnu/stubs-32.hnão é direcionado incluído nos programas. É um arquivo de cabeçalho do tipo back-end gnu/stubs.h, exatamente como gnu/stubs-64.h. Você pode instalar o multilibpacote para adicionar ambos.

user2775212
fonte
0

# sudo apt-get install g ++ - multilib

Deve corrigir esse erro em máquinas de 64 bits (Debian / Ubuntu).

skrishnakar
fonte
0

Se você está enfrentando esse problema no terminal Mac-OSX com python, tente atualizar as versões dos pacotes que você está usando. Portanto, acesse seus arquivos em python e, onde você especificou os pacotes, atualize-os para as versões mais recentes disponíveis na Internet.

D.Bhatia
fonte
0

No Debian / Ubuntu, use:

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

Keivan
fonte