Faltam incluir "bits / c ++ config.h" ao compilar um programa de 64 bits em 32 bits no Ubuntu

181

Estou executando a versão de 32 bits do Ubuntu 10.10 e tentando cruzar a compilação para um destino de 64 bits. Com base em minha pesquisa, instalei o pacote g ++ - multilib.

O programa é um olá mundo muito simples:

#include <iostream>

int main( int argc, char** argv )
{
  std::cout << "hello world" << std::endl;
  return 0;
}

Compilar:

g++ -m64 main.cpp

Erro:

In file included from main.cpp:1:
/usr/include/c++/4.4/iostream:39: fatal error: bits/c++config.h: No such file or directory
compilation terminated.

Eu encontrei um c++config.harquivo, mas eles residem sob o i486-linux-gnue i686-linux-gnudiretórios em /usr/include/c++/4.4/Não há c++config.hno /usr/include/c++/bits.

Alguma idéia do que estou perdendo? Compilar sem o -m64sinalizador funciona bem (a.out é criado e executado corretamente).

Editar Graças à dica do @nightcracker, investiguei um pouco mais a estrutura de inclusão nos sistemas de 32 e 64 bits. Eu adicionei uma resposta abaixo que "corrige" o problema temporariamente, mas acho que ele será interrompido na próxima atualização. Basicamente, estou faltando um diretório chamado /usr/include/c++/4.4/i686-linux-gnu/64que deve conter um subdiretório chamado bitsque possui o arquivo de inclusão ausente. Alguma idéia de qual pacote deveria cuidar disso?

Jesse Vogt
fonte
1
Uau ... eu também tive esse problema. GCC 4.8 em um CubieTruck ARMv7-a (Cortex-A7) executando o Ubuntu. O mais bizarro (para mim) é que a resposta de Anthony o corrigiu. Seja qual for ...
JWW

Respostas:

308

Adicionando esta resposta parcialmente porque ele corrigiu o meu problema do mesmo problema e, portanto, posso marcar essa pergunta como favorito.

Consegui corrigi-lo fazendo o seguinte:

sudo apt-get install gcc-multilib g++-multilib

Se você instalou uma versão de gcc/ g++que não é enviada por padrão (como g++-4.8no lucid), você também deve corresponder à versão:

sudo apt-get install gcc-4.8-multilib g++-4.8-multilib
Anthony Sottile
fonte
30
Certifique-se de combinar as versões do gcc and g++instalado no seu sistema. No Ubuntu 14.04 eu tinha gcc-4.8e g++-4.8instalado, então eu instalei gcc-4.8-multilib e g++-4.8-multilibem vez disso.
Zoltán
3
Isso resolveu meu problema ao compilar com -m32 em uma máquina de 64 bits. Obrigado
nic
41
Obrigado pelo ponteiro, mas sudo apt-get install gcc-multilib g++-multilibparece melhor (ele resolve sua versão do gcc automaticamente).
Leesei
^ talvez não! A sugestão de @ Zoltan funcionou para mim. Anthony Sottile, talvez você devesse incorporar o comentário de Zoltan na sua resposta?
Man
@Man fique à vontade para sugerir uma edição, quando eu inicialmente postou eu combinava com a versão pediu na pergunta, que desde então tem mudado de outras das edições
Anthony Sottile
11

Você tentou adicionar -I/usr/include/c++/4.4/i486-linux-gnuou -I/usr/include/c++/4.4/i686-linux-gnu?

orlp
fonte
Isso realmente funciona. Alguma idéia de por que eu precisaria fazer isso por apenas 64 bits? Estou tentando configurar esta máquina para ajudar nas compilações distribuídas de 64 bits e quero evitar muita personalização.
precisa saber é o seguinte
2
Sinto muito, eu não tenho idéia, eu só representava uma solução hacky de trabalho rápida :)
orlp
5

Ao compilar no RHEL 6.2 (x86_64), instalei os pacotes libstdc ++ - dev de 32 bits e 64 bits, mas tive o problema "c ++ config.h sem esse arquivo ou diretório ".

Resolução:

O diretório /usr/include/c++/4.4.6/x86_64-redhat-linuxestava ausente.

Eu fiz o seguinte:

cd /usr/include/c++/4.4.6/
mkdir x86_64-redhat-linux
cd x86_64-redhat-linux
ln -s ../i686-redhat-linux 32

Agora sou capaz de compilar binários de 32 bits em um sistema operacional de 64 bits.

Pekmez
fonte
1
No OpenSUSE eu fizcd /usr/include/c++/4.6;ln -s x86_64-suse-linux i586-suse-linux
Jul
3

Parece ser um erro de digitação nesse pacote do gcc. A solução:

mv /usr/include/c++/4.x/i486-linux-gnu /usr/include/c++/4.x/i686-linux-gnu/64
DanceDance
fonte
2

No meu sistema de 64 bits, notei que o seguinte diretório existia:

/usr/include/c++/4.4/x86_64-linux-gnu/32/bits

Faria sentido que, no meu sistema de 32 bits, configurado para a compilação cruzada de 64 bits, houvesse um diretório correspondente como:

/usr/include/c++/4.4/i686-linux-gnu/64/bits

Eu verifiquei duas vezes e este diretório não existia. A execução g++do parâmetro detalhado mostrou que o compilador estava realmente procurando algo neste local:

jesse@shalored:~/projects/test$ g++ -v -m64 main.cpp 
Using built-in specs.
Target: i686-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu/Linaro 4.4.4-14ubuntu5' --with-bugurl=file:///usr/share/doc/gcc-4.4/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.4 --enable-shared --enable-multiarch --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.4 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-objc-gc --enable-targets=all --disable-werror --with-arch-32=i686 --with-tune=generic --enable-checking=release --build=i686-linux-gnu --host=i686-linux-gnu --target=i686-linux-gnu
Thread model: posix
gcc version 4.4.5 (Ubuntu/Linaro 4.4.4-14ubuntu5) 
COLLECT_GCC_OPTIONS='-v' '-m64' '-shared-libgcc' '-mtune=generic'
 /usr/lib/gcc/i686-linux-gnu/4.4.5/cc1plus -quiet -v -imultilib 64 -D_GNU_SOURCE main.cpp -D_FORTIFY_SOURCE=2 -quiet -dumpbase main.cpp -m64 -mtune=generic -auxbase main -version -fstack-protector -o /tmp/ccMvIfFH.s
ignoring nonexistent directory "/usr/include/c++/4.4/i686-linux-gnu/64"
ignoring nonexistent directory "/usr/local/include/x86_64-linux-gnu"
ignoring nonexistent directory "/usr/lib/gcc/i686-linux-gnu/4.4.5/../../../../i686-linux-gnu/include"
#include "..." search starts here:
#include <...> search starts here:
 /usr/include/c++/4.4
 /usr/include/c++/4.4/backward
 /usr/local/include
 /usr/lib/gcc/i686-linux-gnu/4.4.5/include
 /usr/lib/gcc/i686-linux-gnu/4.4.5/include-fixed
 /usr/include/x86_64-linux-gnu
 /usr/include
End of search list.
GNU C++ (Ubuntu/Linaro 4.4.4-14ubuntu5) version 4.4.5 (i686-linux-gnu)
    compiled by GNU C version 4.4.5, GMP version 4.3.2, MPFR version 3.0.0-p3.
GGC heuristics: --param ggc-min-expand=98 --param ggc-min-heapsize=128197
Compiler executable checksum: 1fe36891f4a5f71e4a498e712867261c
In file included from main.cpp:1:
/usr/include/c++/4.4/iostream:39: fatal error: bits/c++config.h: No such file or directory
compilation terminated.

O erro em relação ao ignoring nonexistent directoryfoi a pista. Infelizmente, ainda não sei qual pacote eu preciso instalar para que esse diretório seja exibido, então apenas copiei o /usr/include/c++/4.4/x86_64-linux-gnu/bitsdiretório da minha máquina de 64 bits para /usr/include/c++/4.4/i686-linux-gnu/64/bitsa minha máquina de 32.

Agora compilando apenas os -m64trabalhos corretamente. A principal desvantagem é que essa ainda não é a maneira correta de fazer as coisas, e acho que na próxima vez que o Update Manager instalar e atualizar para o g ++, as coisas podem quebrar.

Jesse Vogt
fonte
1

Basicamente, é usado no HeapOverflows ou em outros problemas do tipo de inversão, ou seja, se você deseja alterar um ELF de 64 bits para um ELF de 32 bits e está mostrando erro durante a conversão.

Você pode simplesmente executar os comandos

apt-get install gcc-multilib g++-multilib

que atualizará suas bibliotecas Pacotes atualizados:

Os seguintes pacotes adicionais serão instalados: g ++ - 8-multilib gcc-8-multilib lib32asan5 lib32atomic1 lib32gcc-8-dev lib32gomp1 lib32itm1 lib32mpx2 lib32quadmath0 lib32stdc ++ - 8-dev lib32ubsan1 libc-dev-bin libc6 libc6-libb6c6c -i386 libc6-dev-x32 libc6-i386 libc6-x32 libx32asan5 libx32atomic1 libx32gcc-8-dev libx32gcc1 libx32gomp1 libx32itm1 libx32quadmath0 libx32stdc ++ - 8-dev libx32stdc ++ 6 libx32an 8-dbg glibc-doc Os seguintes novos pacotes serão instalados:g ++ - 8-multilib g ++ - multilib gcc-8-multilib gcc-multilib lib32asan5 lib32atomic1 lib32gcc-8-dev lib32gomp1 lib32itm1 lib32mpx2 lib32quadmath0 lib32stdc ++ - 8-lib lib32ubsan1 libc6-dev-i386 libc632 libx632 libc632 8-dev libx32gcc1 libx32gomp1 libx32itm1 libx32quadmath0 libx32stdc ++ - 8-dev libx32stdc ++ 6 libx32ubsan1

semelhante a este será mostrado ao seu terminal

Luftatako
fonte
0

Da minha experiência, sudo apt-get install gcc-multilib g++-multilibajuda. Mas o meu outro problema é que ESQUECI de limpar o diretório para continuar com o mesmo erro. É a primeira vez que usa clang ou cmake. Então, eu apenas apago meu diretório original e recompile e ele funciona. Espero que ajude alguém como eu.

Coerência
fonte