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?
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
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
?
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.
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
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.
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
Este error se solucionó en "gcc-4.6".
Https://bugs.launchpad.net/ubuntu/+source/gcc-4.5 / + bug/793411
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
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