Ich verwende die 32-Bit-Version von Ubuntu 10.10 und versuche, die Kompilierung auf ein 64-Bit-Ziel zu übertragen. Aufgrund meiner Recherchen habe ich das g ++ - Multilib-Paket installiert.
Das Programm ist eine sehr einfache Hallo Welt:
#include <iostream>
int main( int argc, char** argv )
{
std::cout << "hello world" << std::endl;
return 0;
}
Kompilieren:
g++ -m64 main.cpp
Error:
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.
Ich habe eine c++config.h
Datei gefunden, aber sie befinden sich unter den Verzeichnissen i486-linux-gnu
und i686-linux-gnu
in. /usr/include/c++/4.4/
Es gibt keine c++config.h
in /usr/include/c++/bits
.
Irgendwelche Ideen, was mir fehlt? Das Kompilieren ohne -m64
Flag funktioniert einwandfrei (a.out wird erstellt und wird ordnungsgemäß ausgeführt).
Bearbeiten Dank des Hinweises von @nightcracker habe ich die Include-Struktur auf den 32- und 64-Bit-Systemen etwas genauer untersucht. Ich habe unten eine Antwort hinzugefügt , die das Problem vorübergehend "behebt", aber ich denke, es wird beim nächsten Update kaputt gehen. Grundsätzlich fehlt mir ein Verzeichnis mit dem Namen /usr/include/c++/4.4/i686-linux-gnu/64
, das ein Unterverzeichnis bits
mit der fehlenden Include-Datei enthalten sollte. Irgendeine Idee, welches Paket sich darum kümmern sollte?
quelle
Antworten:
Diese Antwort wurde teilweise hinzugefügt, da dadurch mein Problem mit demselben Problem behoben wurde und ich diese Frage selbst mit einem Lesezeichen versehen kann.
Ich konnte das Problem wie folgt beheben:
Wenn Sie eine Version von
gcc
/ installiert habeng++
, die nicht standardmäßig ausgeliefert wird (z. B.g++-4.8
auf lucid), möchten Sie auch die Version anpassen:quelle
gcc and g++
auf Ihrem System installierten Versionen übereinstimmen . Unter Ubuntu 14.04 hattegcc-4.8
undg++-4.8
installierte ich, also installierte ichgcc-4.8-multilib
undg++-4.8-multilib
stattdessen.sudo apt-get install gcc-multilib g++-multilib
scheint aber besser zu sein (er wird automatisch in Ihre gcc-Version aufgelöst).Haben Sie versucht,
-I/usr/include/c++/4.4/i486-linux-gnu
oder hinzuzufügen-I/usr/include/c++/4.4/i686-linux-gnu
?quelle
Beim Kompilieren in RHEL 6.2 (x86_64) habe ich sowohl 32-Bit- als auch 64-Bit-libstdc ++ - dev-Pakete installiert, aber ich hatte die "c ++ config.h" keine solche Datei oder kein solches Verzeichnis Problem ".
Auflösung:
Das Verzeichnis
/usr/include/c++/4.4.6/x86_64-redhat-linux
fehlte.Ich habe folgendes gemacht:
Ich kann jetzt 32-Bit-Binärdateien auf einem 64-Bit-Betriebssystem kompilieren.
quelle
cd /usr/include/c++/4.6;ln -s x86_64-suse-linux i586-suse-linux
Scheint ein Tippfehler in diesem Paket von gcc zu sein. Die Lösung:
quelle
Auf meinem 64-Bit-System habe ich festgestellt, dass das folgende Verzeichnis vorhanden ist:
Es wäre dann sinnvoll, dass auf meinem 32-Bit-System, das für das 64-Bit-Cross-Compilieren eingerichtet wurde, ein entsprechendes Verzeichnis vorhanden sein sollte wie:
Ich habe es doppelt überprüft und dieses Verzeichnis existierte nicht. Das Ausführen
g++
mit dem ausführlichen Parameter zeigte, dass der Compiler tatsächlich an dieser Stelle nach etwas suchte:Der Fehler bezüglich
ignoring nonexistent directory
war der Hinweis. Leider weiß ich immer noch nicht, welches Paket ich installieren muss, damit dieses Verzeichnis angezeigt wird. Deshalb habe ich das/usr/include/c++/4.4/x86_64-linux-gnu/bits
Verzeichnis einfach von meinem 64-Bit-Computer/usr/include/c++/4.4/i686-linux-gnu/64/bits
auf meinen 32-Computer kopiert .Jetzt
-m64
funktioniert nur das Kompilieren richtig. Der Hauptnachteil ist, dass dies immer noch nicht die richtige Vorgehensweise ist und ich vermute, dass bei der nächsten Installation von Update Manager und der Aktualisierung auf g ++ möglicherweise Probleme auftreten.quelle
Dieser Fehler wurde in "gcc-4.6" behoben.
https://bugs.launchpad.net/ubuntu/+source/gcc-4.5/+bug/793411
quelle
Grundsätzlich wird es in HeapOverflows oder anderen Umkehrproblemen verwendet. Probleme, dh wenn Sie eine 64-Bit-ELF in eine 32-Bit-ELF ändern möchten und beim Konvertieren ein Fehler angezeigt wird.
Sie können die Befehle einfach ausführen
Dadurch werden Ihre Bibliotheken aktualisiert. Aktualisierte Pakete:
Ähnliches wird Ihrem Terminal angezeigt
quelle
Aus meiner Erfahrung
sudo apt-get install gcc-multilib g++-multilib
hilft. Aber mein anderes Problem ist, dass ich VERGESSEN habe, das Verzeichnis zu bereinigen, damit ich immer noch den gleichen Fehler bekomme. Es ist das erste Mal, dass Clang oder Cmake verwendet werden. Also lösche ich einfach mein ursprüngliches Verzeichnis und kompiliere es neu und es funktioniert. Hoffe es hilft jemandem wie mir.quelle