Falta incluir " bits / c++config.h " al compilar programa de 64 bits en 32 bits en Ubuntu


Estoy ejecutando la versión de 32 bits de Ubuntu 10.10 y tratando de compilar de forma cruzada a un destino de 64 bits. Basado en mi investigación, he instalado el paquete g++-multilib.

El programa es un hello world 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 archivo c++config.h pero residen bajo 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 estoy perdiendo? Compilar sin la bandera -m64 funciona bien (un.out se crea y se ejecuta correctamente).

Edit 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 respuesta debajo que "corrige" el problema temporalmente, pero creo que se romperá 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. Cualquier idea de qué paquete debe ¿te encargarás de esto?

Author: Community, 2011-01-10

7 answers

Agregar esta respuesta parcialmente porque solucionó mi problema del mismo problema y así puedo marcar esta pregunta yo mismo.

Pude arreglarlo haciendo lo siguiente:

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

Si ha instalado una versión de gcc / g++ eso no se envía por defecto (como g++-4.8 en lucid) también querrás que coincida con la versión:

sudo apt-get install gcc-4.8-multilib g++-4.8-multilib
 238
Author: Anthony Sottile,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-27 00:11:52

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

 10
Author: orlp,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-10 02:24:37

Mientras compilaba en RHEL 6.2 (x86_64), instalé paquetes libstdc++-dev de 32 bits y 64 bits, pero tenía la configuración de "c++.h no hay tal archivo o directorio" problema.

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

 4
Author: Pekmez,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-03-08 15:25:32

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
 3
Author: DanceDance,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-12-14 09:05:02

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 había sido 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

Comprobé dos veces y este directorio no existía. Ejecutar g++ con el parámetro verbose mostró que el compilador estaba realmente 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 a la 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 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 de 32.

Ahora compilar solo con -m64 funciona correctamente. El mayor inconveniente es que esta aún no es la forma correcta de hacer las cosas y supongo que la próxima vez que Update Manager instale y actualice a g++ las cosas pueden romperse.

 2
Author: Jesse Vogt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-10 03:28:58
 2
Author: Paisa Seeluangsawat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-08-01 18:05:14

El archivo de 64 bits c++config.h está allí en sistemas de 32 bits y viceversa. Instale el paquete g++-multilib, para que pueda instalarlo fácilmente en la terminal usando el comando:

sudo apt-get install g++-multilib
 0
Author: crackhead.h,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-20 13:20:25