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.


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.


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

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.


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.


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 ...


Í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.


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.


0

# sudo apt-get install g ++ - multilib

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


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.


0

No Debian / Ubuntu, use:

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.