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.h
arquivo, mas eles residem sob o i486-linux-gnu
e i686-linux-gnu
diretórios em /usr/include/c++/4.4/
Não há c++config.h
no /usr/include/c++/bits
.
Alguma idéia do que estou perdendo? Compilar sem o -m64
sinalizador 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/64
que deve conter um subdiretório chamado bits
que possui o arquivo de inclusão ausente. Alguma idéia de qual pacote deveria cuidar disso?
fonte
Respostas:
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:
Se você instalou uma versão de
gcc
/g++
que não é enviada por padrão (comog++-4.8
no lucid), você também deve corresponder à versão:fonte
gcc and g++
instalado no seu sistema. No Ubuntu 14.04 eu tinhagcc-4.8
eg++-4.8
instalado, então eu instaleigcc-4.8-multilib
eg++-4.8-multilib
em vez disso.sudo apt-get install gcc-multilib g++-multilib
parece melhor (ele resolve sua versão do gcc automaticamente).Você tentou adicionar
-I/usr/include/c++/4.4/i486-linux-gnu
ou-I/usr/include/c++/4.4/i686-linux-gnu
?fonte
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-linux
estava ausente.Eu fiz o seguinte:
Agora sou capaz de compilar binários de 32 bits em um sistema operacional de 64 bits.
fonte
cd /usr/include/c++/4.6;ln -s x86_64-suse-linux i586-suse-linux
Parece ser um erro de digitação nesse pacote do gcc. A solução:
fonte
No meu sistema de 64 bits, notei que o seguinte diretório existia:
Faria sentido que, no meu sistema de 32 bits, configurado para a compilação cruzada de 64 bits, houvesse um diretório correspondente como:
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:O erro em relação ao
ignoring nonexistent directory
foi 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/bits
diretório da minha máquina de 64 bits para/usr/include/c++/4.4/i686-linux-gnu/64/bits
a minha máquina de 32.Agora compilando apenas os
-m64
trabalhos 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.fonte
Este bug foi corrigido no "gcc-4.6".
https://bugs.launchpad.net/ubuntu/+source/gcc-4.5/+bug/793411
fonte
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
que atualizará suas bibliotecas Pacotes atualizados:
semelhante a este será mostrado ao seu terminal
fonte
Da minha experiência,
sudo apt-get install gcc-multilib g++-multilib
ajuda. 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.fonte