J'utilise la version 32 bits d'Ubuntu 10.10 et j'essaie de croiser la compilation vers une cible 64 bits. Sur la base de mes recherches, j'ai installé le package g ++ - multilib.
Le programme est un bonjour tout 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 c++config.h
fichier , mais ils résident sous le i486-linux-gnu
et i686-linux-gnu
répertoires /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? La compilation sans l' -m64
indicateur fonctionne correctement (a.out est créé et s'exécute correctement).
Edit Grâce à l'indication 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é une réponse ci-dessous qui "corrige" le problème temporairement mais je pense que cela 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é contenant bits
le fichier include manquant. Avez-vous une idée du paquet qui devrait s'en occuper?
la source
Réponses:
L'ajout de cette réponse en partie parce que cela a résolu mon problème du même problème et que je peux donc ajouter cette question moi-même.
J'ai pu résoudre ce problème en procédant comme suit:
Si vous avez installé une version de
gcc
/g++
qui n'est pas livrée par défaut (commeg++-4.8
sur lucid), vous voudrez également faire correspondre la version:la source
gcc and g++
installé sur votre système. Sur Ubuntu 14.04, j'avaisgcc-4.8
etg++-4.8
installé, donc j'ai installégcc-4.8-multilib
et à lag++-4.8-multilib
place.sudo apt-get install gcc-multilib g++-multilib
semble mieux (il se résout automatiquement à votre version gcc).Avez-vous essayé d'ajouter
-I/usr/include/c++/4.4/i486-linux-gnu
ou-I/usr/include/c++/4.4/i686-linux-gnu
?la source
Lors de la compilation dans RHEL 6.2 (x86_64), j'ai installé les packages libstdc ++ - dev 32 bits et 64 bits, mais j'ai eu le problème "c ++ config.h no such file or directory ".
Résolution:
Le répertoire
/usr/include/c++/4.4.6/x86_64-redhat-linux
était manquant.J'ai fait ce qui suit:
Je suis maintenant capable de compiler des binaires 32 bits sur un système d'exploitation 64 bits.
la source
cd /usr/include/c++/4.6;ln -s x86_64-suse-linux i586-suse-linux
Semble être une erreur de frappe dans ce paquet de gcc. La solution:
la source
Sur mon système 64 bits, j'ai remarqué que le répertoire suivant existait:
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:
J'ai vérifié deux fois et ce répertoire n'existait pas. L'exécution
g++
avec le paramètre verbose a montré que le compilateur recherchait réellement quelque chose à cet emplacement:L'erreur concernant le
ignoring nonexistent directory
était l'indice. Malheureusement, je ne sais toujours pas quel package je dois installer pour que ce répertoire s'affiche, je viens donc de copier le/usr/include/c++/4.4/x86_64-linux-gnu/bits
répertoire de ma machine 64 bits/usr/include/c++/4.4/i686-linux-gnu/64/bits
sur ma machine 32.Maintenant compiler avec juste les
-m64
travaux correctement. L'inconvénient majeur est que ce n'est toujours pas la bonne façon de faire les choses et je suppose que la prochaine fois qu'Update Manager sera installé et mis à jour vers g ++, les choses risquent de se casser.la source
Ce bogue est corrigé dans "gcc-4.6".
https://bugs.launchpad.net/ubuntu/+source/gcc-4.5/+bug/793411
la source
Fondamentalement, il est utilisé dans HeapOverflows ou d'autres problèmes de type inverseur, c'est-à-dire si vous souhaitez changer un ELF 64 bits en ELF 32 bits et qu'il affiche une erreur lors de la conversion.
Vous pouvez simplement exécuter les commandes
qui mettra à jour vos bibliothèques Packages mis à jour:
similaire à celui-ci sera affiché sur votre terminal
la source
D'après mon expérience, ça
sudo apt-get install gcc-multilib g++-multilib
aide. Mais mon autre problème est que j'OUBLIE de nettoyer le répertoire afin que j'obtienne toujours la même erreur. C'est la première fois que vous utilisez clang ou cmake. Donc je supprime simplement mon répertoire d'origine et recompile et ça marche. J'espère que ça aide quelqu'un comme moi.la source