ubuntu g++ 32bit-64bit cross-compiling ubuntu-10.10

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.



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