Manca includere “bits / c ++ config.h” quando si compila un programma a 64 bit su 32 bit in Ubuntu

Sto facendo funzionare la versione a 32 bit di Ubuntu 10.10 e sto provando a compilare a croce una destinazione a 64 bit. Sulla base della mia ricerca, ho installato il pacchetto g ++ – multilib.

Il programma è un mondo ciao molto semplice:

#include  int main( int argc, char** argv ) { std::cout << "hello world" << std::endl; return 0; } 

Compilare:

 g++ -m64 main.cpp 

Errore:

 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. 

Ho trovato un file c++config.h ma risiedono nelle directory i486-linux-gnu e i686-linux-gnu in /usr/include/c++/4.4/ Non c’è c++config.h in /usr/include/c++/bits .

Qualche idea su cosa mi manca? La compilazione senza il flag -m64 funziona correttamente (a.out viene creato e viene eseguito correttamente).

Modifica Grazie al suggerimento di @nightcracker, ho fatto ulteriori ricerche sulla struttura di inclusione sui sistemi a 32 e 64 bit. Ho aggiunto una risposta di seguito che “risolve” il problema temporaneamente, ma penso che si romperà al prossimo aggiornamento. Fondamentalmente, mi manca una directory chiamata /usr/include/c++/4.4/i686-linux-gnu/64 che dovrebbe contenere una sottodirectory chiamata bits che ha il file include mancante. Qualche idea su quale pacchetto dovresti occuparti di questo?

Aggiungendo questa risposta parzialmente perché ha risolto il mio problema con lo stesso problema e quindi posso aggiungere questa domanda ai segnalibri.

Sono stato in grado di risolverlo facendo quanto segue:

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

Se hai installato una versione di gcc / g++ che non viene spedita per impostazione predefinita (come g++-4.8 su shiny) ti consigliamo di abbinare anche la versione:

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

Hai provato ad aggiungere -I/usr/include/c++/4.4/i486-linux-gnu o -I/usr/include/c++/4.4/i686-linux-gnu ?

Durante la compilazione in RHEL 6.2 (x86_64), ho installato entrambi i pacchetti libstdc ++ – dev a 32 bit e 64 bit, ma ho avuto il problema “c ++ config.h nessun file o directory “.

Risoluzione:

/usr/include/c++/4.4.6/x86_64-redhat-linux directory /usr/include/c++/4.4.6/x86_64-redhat-linux .

Ho fatto quanto segue:

 cd /usr/include/c++/4.4.6/ mkdir x86_64-redhat-linux cd x86_64-redhat-linux ln -s ../i686-redhat-linux 32 

Ora sono in grado di compilare binari a 32 bit su un sistema operativo a 64 bit.

Sembra essere un errore di battitura in quel pacchetto di gcc. La soluzione:

 mv /usr/include/c++/4.x/i486-linux-gnu /usr/include/c++/4.x/i686-linux-gnu/64 

Sul mio sistema a 64 bit ho notato che esisteva la seguente directory:

 /usr/include/c++/4.4/x86_64-linux-gnu/32/bits 

Avrebbe quindi senso che sul mio sistema a 32 bit che era stato configurato per la compilazione incrociata a 64 bit ci dovrebbe essere una directory corrispondente come:

 /usr/include/c++/4.4/i686-linux-gnu/64/bits 

Ho controllato due volte e questa directory non esisteva. L’esecuzione di g++ con il parametro verbose ha mostrato che il compilatore stava effettivamente cercando qualcosa in questa posizione:

 [email protected]:~/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. 

L’errore riguardante l’ ignoring nonexistent directory era l’indizio. Sfortunatamente, non so ancora quale pacchetto devo installare per visualizzare questa directory, quindi ho appena copiato la directory /usr/include/c++/4.4/x86_64-linux-gnu/bits dalla mia macchina a 64 bit in /usr/include/c++/4.4/i686-linux-gnu/64/bits sulla mia 32 macchina.

Ora la compilazione con solo il -m64 funziona correttamente. Lo svantaggio principale è che questo non è ancora il modo corretto di fare le cose e immagino che la prossima volta che Update Manager si installerà e si aggiornerà alle cose di g ++ potrebbe rompersi.

Questo bug è stato risolto in “gcc-4.6”.

https://bugs.launchpad.net/ubuntu/+source/gcc-4.5/+bug/793411

I file a 64 bit bit c++config.h sono presenti nei sistemi a 32 bit e viceversa. Installa il pacchetto g++-multilib , così puoi installarlo facilmente sul terminale usando il comando:

 sudo apt-get install g++-multilib