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?
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
avez-vous essayé d'ajouter -I/usr/include/c++/4.4/i486-linux-gnu
ou -I/usr/include/c++/4.4/i686-linux-gnu
?
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.
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
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.
Ce bug est corrigé dans "gcc-4.6".
https://bugs.launchpad.net/ubuntu/+source/gcc-4.5 / + bug / 793411
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