wake-up-neo.net

Fehlendes Include "bits / c ++ config.h" beim Cross-Compilieren von 64-Bit-Programmen auf 32-Bit in Ubuntu

Ich verwende die 32-Bit-Version von Ubuntu 10.10 und versuche, auf ein 64-Bit-Ziel zu kompilieren. Aufgrund meiner Recherchen habe ich das Paket g ++ - multilib 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 in den Verzeichnissen i486-linux-gnu Und i686-linux-gnu In /usr/include/c++/4.4/. Es gibt kein c++config.h In /usr/include/c++/bits.

Irgendwelche Ideen, was mir fehlt? Das Kompilieren ohne das Flag -m64 Funktioniert einwandfrei (a.out wird erstellt und korrekt 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 ein Antwort hinzugefügt, das 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 mit dem Namen bits mit der fehlenden Include-Datei enthalten sollte. Irgendeine Idee, welches Paket sich darum kümmern sollte?

161
Jesse Vogt

Diese Antwort wurde teilweise hinzugefügt, da dies mein Problem mit demselben Problem behoben hat und ich diese Frage selbst als Lesezeichen setzen kann.

Ich konnte das Problem folgendermaßen beheben:

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

Wenn Sie eine Version von gcc/g++ Installiert haben, die nicht standardmäßig ausgeliefert wird (z. B. g++-4.8 Bei lucid), möchten Sie auch die Version abgleichen :

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

Haben Sie versucht, -I/usr/include/c++/4.4/i486-linux-gnu oder -I/usr/include/c++/4.4/i686-linux-gnu?

10
orlp

Beim Kompilieren in RHEL 6.2 (x86_64) habe ich sowohl 32-Bit- als auch 64-Bit-libstdc ++ - dev-Pakete installiert, aber ich hatte das Problem "c ++ config.h keine solche Datei oder solches Verzeichnis".

Auflösung:

Das Verzeichnis /usr/include/c++/4.4.6/x86_64-redhat-linux fehlte.

Ich habe folgendes gemacht:

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

Ich bin jetzt in der Lage, 32-Bit-Binärdateien auf einem 64-Bit-Betriebssystem zu kompilieren.

5
Pekmez

Scheint ein Tippfehler in diesem Paket von gcc zu sein. Die Lösung:

mv /usr/include/c++/4.x/i486-linux-gnu /usr/include/c++/4.x/i686-linux-gnu/64
3
DanceDance

Auf meinem 64-Bit-System ist mir aufgefallen, dass das folgende Verzeichnis existiert:

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

Es wäre dann sinnvoll, auf meinem 32-Bit-System, das für das 64-Bit-Cross-Compilieren eingerichtet wurde, ein entsprechendes Verzeichnis wie das folgende zu erstellen:

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

Ich habe zweimal nachgesehen und dieses Verzeichnis existiert nicht. Laufen g++ mit dem verbose-Parameter zeigte an, dass der Compiler tatsächlich an dieser Stelle nach etwas suchte:

[email protected]:~/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.

Der Fehler bezüglich der ignoring nonexistent directory war der Anhaltspunkt. Leider weiß ich immer noch nicht, welches Paket ich installieren muss, damit dieses Verzeichnis angezeigt wird. Deshalb habe ich nur das /usr/include/c++/4.4/x86_64-linux-gnu/bits Verzeichnis von meinem 64-Bit-Rechner zu /usr/include/c++/4.4/i686-linux-gnu/64/bits auf meiner 32 Maschine.

Kompilieren Sie jetzt nur mit dem -m64 funktioniert richtig. Der Hauptnachteil ist, dass dies immer noch nicht die richtige Vorgehensweise ist und ich vermute, dass beim nächsten Installieren von Update Manager und Aktualisieren auf g ++ Probleme auftreten können.

2
Jesse Vogt
2

Grundsätzlich wird es bei HeapOverflows oder anderen Umkehrproblemen verwendet, d. H., Wenn Sie eine 64-Bit-ELF in eine 32-Bit-ELF ändern möchten und beim Konvertieren ein Fehler auftritt.

Sie können einfach die Befehle ausführen

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

wodurch werden Ihre Bibliotheken aktualisiert? Aktualisierte Pakete:

Die folgenden zusätzlichen Pakete werden installiert: g ++ - 8-multilib gcc-8-multilib lib32asan5 lib32atomic1 lib32gcc-8-dev lib32gomp1 lib32itm1 lib32mpx2 lib32quadmath0 lib32stdc ++ - 8-dev lib32ubsan1 libc-dev-bin libc6 libc6-dbg libc -i386 libc6-dev-x32 libc6-i386 libc6-x32 libx32asan5 libx32atomic1 libx32gcc-8-dev libx32gcc1 libx32gomp1 libx32itm1 libx32quadmath0 libx32stdc ++ - 8-dev libx32stdc ++ 6 libx32st 8-dbg glibc-doc Die folgenden NEUEN Pakete werden installiert: g ++ - 8-multilib g ++ - multilib gcc-8-multilib gcc-multilib lib32asan5 lib32atomic1 lib32gcc-8-dev lib32gomp1 lib32itm1 lib32mpx2 lib32quadmath0 lib32stdc ++ - 8-dev-lib32cub -i386 libc6-dev-x32 libc6-x32 libx32asan5 libx32atomic1 libx32gcc-8-dev libx32gcc1 libx32gomp1 libx32itm1 libx32quadmath0 libx32stdc ++ - 8-dev libx32stdc ++ 6 libx32ubsan1

ähnliches wird auf Ihrem Terminal angezeigt

1
Luftatako

Meiner Erfahrung nach, Sudo apt-get install gcc-multilib g++-multilib hilft. Aber mein anderes Problem ist, dass ich VERGESSE, das Verzeichnis zu säubern, also erhalte ich noch den gleichen Fehler. Es ist das erste Mal, dass Sie clang oder cmake verwenden. Also lösche ich einfach mein ursprüngliches Verzeichnis und kompiliere es neu und es funktioniert. Hoffe es hilft jemandem wie mir.

0
Coherence