Manquant inclure des "bits/c++config.h " lors de la compilation croisée programme 64 bits sur 32 bits dans Ubuntu

j'exécute la version 32bit D'Ubuntu 10.10 et j'essaie de croiser la compilation avec une cible 64 bits. Sur la base de mes recherches, j'ai installé le paquet g++-multilib.

le programme est un monde hello très simple:

#include <iostream>

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

compiler:

g++ -m64 main.cpp

erreur:

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.

j'ai trouvé un fichier c++config.h mais ils résident sous les répertoires i486-linux-gnu et i686-linux-gnu dans /usr/include/c++/4.4/ il n'y a pas c++config.h dans /usr/include/c++/bits .

une idée de ce qui me manque? Compiler sans le drapeau -m64 fonctionne bien (A. out est créé et fonctionne correctement).

Edit grâce à l'indice de @nightcracker, j'ai fait un peu plus d'enquête sur la structure d'inclusion sur les systèmes 32 et 64 bits. J'ai ajouté un réponse ci-dessous qui "résout" le problème temporairement, mais je pense qu'il va briser sur la prochaine mise à jour. Fondamentalement, il me manque un répertoire appelé /usr/include/c++/4.4/i686-linux-gnu/64 qui devrait contenir un sous-répertoire appelé bits qui a le fichier include manquant. Une idée du paquet qui devrait s'occuper de ça?

139
demandé sur Community 2011-01-10 05:20:44

7 réponses

ajouter cette réponse en partie parce qu'il a corrigé mon problème de la même question et donc je peux marquer cette question moi-même.

j'ai pu le corriger en faisant ce qui suit:

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

si vous avez installé une version de gcc / g++ qui n'est pas livrée par défaut (comme g++-4.8 sur lucid) ,vous voudrez faire correspondre la version aussi:

sudo apt-get install gcc-4.8-multilib g++-4.8-multilib
238
répondu Anthony Sottile 2016-07-27 00:11:52

avez-vous essayé d'ajouter -I/usr/include/c++/4.4/i486-linux-gnu ou -I/usr/include/c++/4.4/i686-linux-gnu ?

10
répondu orlp 2011-01-10 02:24:37

lors de la compilation dans RHEL 6.2 (x86_64), j'ai installé les paquets 32bit et 64bit libstdc++-dev, mais j'ai eu la configuration " c++.h aucun fichier ou répertoire problème".

résolution:

Le répertoire /usr/include/c++/4.4.6/x86_64-redhat-linux est absent.

j'ai fait ce qui suit:

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

je suis maintenant capable de compiler des binaires 32bit sur un OS 64bit.

4
répondu Pekmez 2012-03-08 15:25:32

semble être une erreur typographique dans ce paquet de gcc. La solution:

mv /usr/include/c++/4.x/i486-linux-gnu /usr/include/c++/4.x/i686-linux-gnu/64
3
répondu DanceDance 2011-12-14 09:05:02

sur mon système 64 bits j'ai remarqué que le répertoire suivant existait:

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

il serait alors logique que sur mon système 32 bits qui avait été configuré pour la compilation croisée 64bit il y ait un répertoire correspondant comme:

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

j'ai vérifié deux fois et ce répertoire n'existait pas. L'exécution de g++ avec le paramètre verbose a montré que le compilateur cherchait quelque chose à cet endroit.:

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.

l'erreur concernant le ignoring nonexistent directory était l'indice. Malheureusement, je ne sais toujours pas quel paquet j'ai besoin d'Installer pour que ce répertoire apparaisse donc j'ai juste copié le répertoire /usr/include/c++/4.4/x86_64-linux-gnu/bits de ma machine 64 bits à /usr/include/c++/4.4/i686-linux-gnu/64/bits sur ma machine 32.

compilant maintenant avec juste le -m64 fonctionne correctement. Le principal inconvénient est que ce n'est toujours pas la bonne façon de faire les choses et je devine la prochaine mise à jour Le gestionnaire installe et met à jour vers g++ les choses peuvent se casser.

2
répondu Jesse Vogt 2011-01-10 03:28:58
2
répondu Paisa Seeluangsawat 2011-08-01 18:05:14

le fichier de bits 64 bits c++config.h est présent dans les systèmes 32 bits et vice-versa. Installez le paquet g++-multilib , de sorte que vous pouvez l'installer facilement sur le terminal en utilisant la commande:

sudo apt-get install g++-multilib
0
répondu crackhead.h 2018-08-20 13:20:25