Falta incluir "bits/c++ config.h" al compilar de forma cruzada programa de 64 bits en 32 bits en Ubuntu
g++ 32bit-64bit (6)
Estoy ejecutando la versión de 32 bits de Ubuntu 10.10 y tratando de realizar una compilación cruzada con un objetivo de 64 bits. Basado en mi investigación, he instalado el paquete g ++ - multilib.
El programa es un mundo de hola 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.
Encontré un archivo c++config.h
pero residen en los directorios i486-linux-gnu
e i686-linux-gnu
en /usr/include/c++/4.4/
No hay c++config.h
en /usr/include/c++/bits
.
¿Alguna idea sobre lo que me estoy perdiendo? Compilar sin el indicador -m64
funciona bien (se crea a.out y se ejecuta correctamente).
Editar Gracias a la sugerencia de @nightcracker, hice un poco más de investigación sobre la estructura de inclusión en los sistemas de 32 y 64 bits. He agregado una answer 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 debe contener un subdirectorio llamado bits
que tiene el archivo de inclusión faltante. ¿Alguna idea de qué paquete debería encargarse de esto?
¿ -I/usr/include/c++/4.4/i486-linux-gnu
agregar -I/usr/include/c++/4.4/i486-linux-gnu
o -I/usr/include/c++/4.4/i686-linux-gnu
?
Agregué esta respuesta parcialmente porque solucionó mi problema del mismo problema y puedo marcar esta pregunta yo mismo.
Pude solucionarlo haciendo lo siguiente:
sudo apt-get install gcc-multilib g++-multilib
Si ha instalado una versión de gcc
/ g++
que no se envía por defecto (como g++-4.8
on lúcido), también querrá hacer coincidir la versión:
sudo apt-get install gcc-4.8-multilib g++-4.8-multilib
En mi sistema de 64 bits noté que el siguiente directorio existía:
/usr/include/c++/4.4/x86_64-linux-gnu/32/bits
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:
/usr/include/c++/4.4/i686-linux-gnu/64/bits
Lo comprobé dos veces y este directorio no existía. La ejecución de g++
con el parámetro detallado mostró que el compilador realmente buscaba algo en esta ubicación:
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.
El error con respecto al ignoring nonexistent directory
fue la clave. Desafortunadamente, todavía no sé qué paquete necesito instalar para que aparezca este directorio, así que simplemente copié el directorio /usr/include/c++/4.4/x86_64-linux-gnu/bits
de mi máquina de 64 bits a /usr/include/c++/4.4/i686-linux-gnu/64/bits
en mi máquina 32.
Ahora compilar solo con -m64
funciona correctamente. El mayor inconveniente es que todavía 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 se pueden romper.
Este error se corrigió en "gcc-4.6".
https://bugs.launchpad.net/ubuntu/+source/gcc-4.5/+bug/793411
Mientras compilaba en RHEL 6.2 (x86_64), instalé los paquetes devst libstdc ++ de 32 bits y 64 bits, pero tenía el problema "c ++ config.h no existe tal archivo o directorio ".
Resolución:
El directorio /usr/include/c++/4.4.6/x86_64-redhat-linux
faltaba.
Hice lo siguiente:
cd /usr/include/c++/4.4.6/
mkdir x86_64-redhat-linux
cd x86_64-redhat-linux
ln -s ../i686-redhat-linux 32
Ahora puedo compilar binarios de 32 bits en un sistema operativo de 64 bits.
Parece ser un error tipográfico en ese paquete de gcc. La solución:
mv /usr/include/c++/4.x/i486-linux-gnu /usr/include/c++/4.x/i686-linux-gnu/64