Estoy ejecutando la versión de 32 bits de Ubuntu 10.10 e intento cruzar la compilación a un objetivo de 64 bits. Según mi investigación, he instalado el paquete g ++ - multilib.
El programa es un hola mundo muy simple:
#include <iostream>
int main( int argc, char** argv )
{
std::cout << "hello world" << std::endl;
return 0;
}
Compilar:
g++ -m64 main.cpp
Error:
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.
He encontrado un c++config.h
archivo pero residen en los directorios i486-linux-gnu
y i686-linux-gnu
en /usr/include/c++/4.4/
No hay c++config.h
en /usr/include/c++/bits
.
¿Alguna idea de lo que me falta? Compilar sin la -m64
bandera funciona bien (a.out se crea y se ejecuta correctamente).
Editar Gracias a la sugerencia de @nightcracker, investigué un poco más sobre la estructura de inclusión en los sistemas de 32 y 64 bits. He agregado una respuesta a continuación que "soluciona" el problema temporalmente, pero creo que se interrumpirá en la próxima actualización. Básicamente, me falta un directorio llamado /usr/include/c++/4.4/i686-linux-gnu/64
que debería contener un subdirectorio llamado bits
que tiene el archivo de inclusión que falta. ¿Alguna idea de qué paquete debería ocuparse de esto?
fuente
Respuestas:
Agregar esta respuesta parcialmente porque solucionó mi problema del mismo problema y así puedo marcar esta pregunta yo mismo.
Pude solucionarlo haciendo lo siguiente:
Si ha instalado una versión de
gcc
/g++
que no se envía de forma predeterminada (comog++-4.8
en lucid), también querrá hacer coincidir la versión:fuente
gcc and g++
instalado en su sistema. En Ubuntu 14.04 tuvegcc-4.8
eg++-4.8
instalé, así que instalégcc-4.8-multilib
y en sug++-4.8-multilib
lugar.sudo apt-get install gcc-multilib g++-multilib
parece mejor (se resuelve automáticamente en tu versión de gcc).¿Intentaste agregar
-I/usr/include/c++/4.4/i486-linux-gnu
o-I/usr/include/c++/4.4/i686-linux-gnu
?fuente
Mientras compilaba en RHEL 6.2 (x86_64), instalé paquetes libstdc ++ - dev de 32 bits y 64 bits, pero tuve el problema "c ++ config.h no existe tal archivo o directorio ".
Resolución:
Faltaba el directorio
/usr/include/c++/4.4.6/x86_64-redhat-linux
.Hice lo siguiente:
Ahora puedo compilar archivos binarios de 32 bits en un sistema operativo de 64 bits.
fuente
cd /usr/include/c++/4.6;ln -s x86_64-suse-linux i586-suse-linux
Parece ser un error tipográfico en ese paquete de gcc. La solución:
fuente
En mi sistema de 64 bits, noté que existía el siguiente directorio:
Entonces tendría sentido que en mi sistema de 32 bits que se había configurado para la compilación cruzada de 64 bits debería haber un directorio correspondiente como:
Verifiqué dos veces y este directorio no existía. Ejecutar
g++
con el parámetro detallado mostró que el compilador realmente estaba buscando algo en esta ubicación:El error con respecto al
ignoring nonexistent directory
fue la pista. Desafortunadamente, todavía no sé qué paquete necesito instalar para que aparezca este directorio, así que simplemente copié el/usr/include/c++/4.4/x86_64-linux-gnu/bits
directorio de mi máquina de 64 bits/usr/include/c++/4.4/i686-linux-gnu/64/bits
en mi máquina de 32.Ahora compilando solo las
-m64
obras correctamente. El principal inconveniente es que esta no es la forma correcta de hacer las cosas y supongo que la próxima vez que Update Manager se instale y actualice a g ++, las cosas pueden fallar.fuente
Este error se corrigió en "gcc-4.6".
https://bugs.launchpad.net/ubuntu/+source/gcc-4.5/+bug/793411
fuente
Básicamente se utiliza en HeapOverflows u otros problemas de tipo de inversión, es decir, si desea cambiar un ELF de 64 bits a ELF de 32 bits y muestra un error durante la conversión.
Simplemente puedes ejecutar los comandos
que actualizará sus bibliotecas Paquetes actualizados:
similar a esto se mostrará a su terminal
fuente
Desde mi experiencia,
sudo apt-get install gcc-multilib g++-multilib
ayuda. Pero mi otro problema es que OLVIDÉ limpiar el directorio, así que sigo teniendo el mismo error. Es la primera vez que usa clang o cmake. Así que simplemente borro mi directorio original y lo vuelvo a compilar y funciona. Espero que ayude a alguien como yo.fuente