Faltan incluir "bits / c ++ config.h" al compilar de forma cruzada el programa de 64 bits en 32 bits en Ubuntu

181

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.harchivo pero residen en los directorios i486-linux-gnuy i686-linux-gnuen /usr/include/c++/4.4/No hay c++config.hen /usr/include/c++/bits.

¿Alguna idea de lo que me falta? Compilar sin la -m64bandera 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/64que debería contener un subdirectorio llamado bitsque tiene el archivo de inclusión que falta. ¿Alguna idea de qué paquete debería ocuparse de esto?

Jesse Vogt
fuente
1
Wow ... yo también tuve este problema. GCC 4.8 en un ARMv7-a CubieTruck (Cortex-A7) con Ubuntu. Lo extraño (para mí) es que la respuesta de Anthony lo arregló. Lo que sea ...
jww

Respuestas:

308

Agregar esta respuesta parcialmente porque solucionó mi problema del mismo problema y así 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 de forma predeterminada (como g++-4.8en lucid), también querrá hacer coincidir la versión:

sudo apt-get install gcc-4.8-multilib g++-4.8-multilib
Anthony Sottile
fuente
30
Asegúrese de hacer coincidir las versiones de gcc and g++instalado en su sistema. En Ubuntu 14.04 tuve gcc-4.8e g++-4.8instalé, así que instalé gcc-4.8-multilib y en su g++-4.8-multiliblugar.
Zoltán
3
Esto resolvió mi problema al compilar con -m32 en una máquina de 64 bits. Gracias
nic
41
Gracias por el puntero, pero sudo apt-get install gcc-multilib g++-multilibparece mejor (se resuelve automáticamente en tu versión de gcc).
Leesei
^ tal vez no! Sin embargo, la sugerencia de @ Zoltan funcionó para mí. Anthony Sottile, ¿tal vez deberías incorporar el comentario de Zoltan en tu respuesta?
Hombre
@Man no dude en sugerir una edición, cuando la publiqué inicialmente coincidí con la versión que se hizo en la pregunta, desde entonces ha cambiado desde las ediciones de otros
Anthony Sottile
11

¿Intentaste agregar -I/usr/include/c++/4.4/i486-linux-gnuo -I/usr/include/c++/4.4/i686-linux-gnu?

orlp
fuente
Eso sí funciona. ¿Alguna idea de por qué tendría que hacer esto por solo 64 bits? Estoy tratando de configurar esta máquina para ayudar con las compilaciones distribuidas de 64 bits y quiero evitar demasiada personalización.
Jesse Vogt
2
Lo siento, no tengo idea, acabo de plantear una solución rápida de trabajo hacky :)
orlp
5

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:

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 archivos binarios de 32 bits en un sistema operativo de 64 bits.

Pekmez
fuente
1
En OpenSUSE lo hicecd /usr/include/c++/4.6;ln -s x86_64-suse-linux i586-suse-linux
Julian
3

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
Baila Baila
fuente
2

En mi sistema de 64 bits, noté que existía el siguiente directorio:

/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

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:

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 directoryfue 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/bitsdirectorio de mi máquina de 64 bits /usr/include/c++/4.4/i686-linux-gnu/64/bitsen mi máquina de 32.

Ahora compilando solo las -m64obras 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.

Jesse Vogt
fuente
1

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

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

que actualizará sus bibliotecas Paquetes actualizados:

Se instalarán los siguientes paquetes adicionales: g ++ - 8-multilib gcc-8-multilib lib32asan5 lib32atomic1 lib32gcc-8-dev lib32gomp1 lib32itm1 lib32mpx2 lib32quadmath0 lib32stdc ++ - 8-dev lib32ubsan1 libc-dev-bin libc6 libc6-dbg libc6-dbg libc6-dev -i386 libc6-dev-x32 libc6-i386 libc6-x32 libx32asan5 libx32atomic1 libx32gcc-8-dev libx32gcc1 libx32gomp1 libx32itm1 libx32quadmath0 libx32stdc ++ - 8-dev libx32stdc ++ 6 libx32c-tcstststfc + t / s / s / s-libx32atomic1 libc32dc 8-dbg glibc-doc Se instalarán los siguientes paquetes NUEVOS:g ++ - 8-multilib g ++ - multilib gcc-8-multilib gcc-multilib lib32asan5 lib32atomic1 lib32gcc-8-dev lib32gomp1 lib32itm1 lib32mpx2 lib32quadmath0 lib32stdc ++ - 8-dev lib32ubsan1 libc6-dev-i386 libc6-dev-x32c32x3232 x 32 8-dev libx32gcc1 libx32gomp1 libx32itm1 libx32quadmath0 libx32stdc ++ - 8-dev libx32stdc ++ 6 libx32ubsan1

similar a esto se mostrará a su terminal

Luftatako
fuente
0

Desde mi experiencia, sudo apt-get install gcc-multilib g++-multilibayuda. 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.

Coherencia
fuente