web-dev-qa-db-fra.com

Include manquant "bits / c ++ config.h" lors de la compilation croisée d'un programme 64 bits sur 32 bits dans Ubuntu

J'utilise la version 32 bits d'Ubuntu 10.10 et j'essaie de procéder à une compilation croisée sur une cible 64 bits. Sur la base de mes recherches, j'ai installé le paquet g ++ - multilib.

Le programme est un monde de salut 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 il se trouve dans 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.

Des idées sur ce qui me manque? Compiler sans le drapeau -m64 fonctionne correctement (a.out est créé et s’exécute correctement).

Modifier Grâce à l'indice de @nightcracker, j'ai approfondi un peu la recherche sur la structure include des 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 se cassera lors de 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 contient le fichier d'inclusion manquant. Avez-vous une idée du forfait qui devrait en prendre soin?

161
Jesse Vogt

L'ajout de cette réponse en partie parce que cela résolvait mon problème du même problème et que je pouvais donc mettre cette question en signet moi-même.

J'ai pu résoudre ce problème en procédant comme 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 (telle que g++-4.8 sur lucid), vous souhaiterez également faire correspondre cette version:

Sudo apt-get install gcc-4.8-multilib g++-4.8-multilib
276
Anthony Sottile

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
orlp

Lors de la compilation dans RHEL 6.2 (x86_64), j’ai installé les paquets libstdc ++-dev 32 bits et 64 bits, mais j’ai eu le problème "c ++ config.h aucun fichier ou répertoire de ce type".

Résolution:

Le répertoire /usr/include/c++/4.4.6/x86_64-redhat-linux était manquant.

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 fichiers binaires 32 bits sur un système d'exploitation 64 bits.

5
Pekmez

Semble être une erreur de frappe 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
DanceDance

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 64 bits, il devrait y avoir 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 réellement quelque chose à cet emplacement:

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 je dois installer pour que ce répertoire apparaisse, alors je viens de copier le répertoire /usr/include/c++/4.4/x86_64-linux-gnu/bits de ma machine 64 bits vers /usr/include/c++/4.4/i686-linux-gnu/64/bits sur ma machine 32.

Maintenant, la compilation avec seulement le -m64 fonctionne correctement. L'inconvénient majeur est que ce n'est toujours pas la bonne façon de faire les choses et je devine que la prochaine fois que Update Manager installera et mettra à jour vers g ++, des problèmes pourraient survenir.

2
Jesse Vogt
2

Fondamentalement, il est utilisé dans HeapOverflows ou dans d’autres problèmes de type à inversion, par exemple si vous souhaitez modifier un ELF 64 bits en un ELF 32 bits et qu’il affiche une erreur lors de la conversion.

Vous pouvez simplement exécuter les commandes

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

qui mettra à jour vos bibliothèques

Les paquetages supplémentaires suivants seront installés: g ++ - 8-multilib gcc-8-multilib lib32asan5 lib32atomic1 lib32gcc-8-dev lib32gomp1 lib32gml1 lib32mpx2 lib32quadmath0 lib32stdc ++ - 8-lib lib32uban1 libc-dev-bin libc6 libc6 libc6 -i386 libc6-dev-x32 libc6-i386 libc6-x32 libx32asan5 libx32atomic1 libx32gcc-8-dev libx32gcc1 libx32gomp1 libx32itm1 libx32quadmath0 libx32stdc ++ - 8-dev libx32stdc ++ 6 libx32ubsan1 paquets suggérés: lib32stdc ++ 6-8-dbg libx32stdc ++ 6- 8-dbg glibc-doc Les NOUVEAUX paquets suivants seront installés: g ++ - 8-multilib g ++ - multilib gcc-8-multilib gcc-multilib lib32asan5 lib32atomic1 lib32gcc-8-dev lib32gomp1 lib32itm1 lib32mpx2 lib32mpx2 lib32mpx2 lib32atomx1 lib32stxmd -i386 libc6-dev-x32 libc6-x32 libx32asan5 libx32atomic1 libx32gcc-8-dev libx32gcc1 libx32gomp1 libx32gomp1 libx32itm1 libx32quadmath0 libx32stdc ++ - 8-dev libx32stdc ++ 6 libx32ubsan

semblable à cela sera montré à votre terminal

1
Luftatako

D'après mon expérience, Sudo apt-get install gcc-multilib g++-multilib aide. Mais mon autre problème est que j’ai oublié de nettoyer le répertoire pour que je reçoive toujours la même erreur. C'est la première fois que l'on utilise clang ou cmake. Donc, je viens de supprimer mon répertoire d'origine et re-compiler et cela fonctionne. J'espère que ça aide quelqu'un comme moi.

0
Coherence