Brakuje „bits / c ++ config.h” podczas kompilacji krzyżowej 64-bitowego programu na 32-bitowym systemie Ubuntu

181

Korzystam z 32-bitowej wersji Ubuntu 10.10 i próbuję przekompilować kompilację do 64-bitowego celu. Na podstawie moich badań zainstalowałem pakiet g ++ - multilib.

Program jest bardzo prostym cześć światem:

#include <iostream>

int main( int argc, char** argv )
{
  std::cout << "hello world" << std::endl;
  return 0;
}

Skompilować:

g++ -m64 main.cpp

Błąd:

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.

Znalazłem c++config.hplik, ale znajdują się one w katalogach i486-linux-gnui w i686-linux-gnufolderze /usr/include/c++/4.4/Nie ma c++config.hw /usr/include/c++/bits.

Jakieś pomysły na to, czego mi brakuje? Kompilacja bez -m64flagi działa poprawnie (a.out jest tworzony i działa poprawnie).

Edycja Dzięki podpowiedzi @nightcracker przeprowadziłem nieco więcej badań nad strukturą dołączania w systemach 32- i 64-bitowych. Poniżej dodałem odpowiedź, która „tymczasowo” rozwiązuje problem, ale myślę, że zepsuje się przy następnej aktualizacji. Zasadniczo brakuje mi katalogu o nazwie, /usr/include/c++/4.4/i686-linux-gnu/64który powinien zawierać nazwany podkatalog zawierający bitsbrakujący plik dołączania. Wiesz, jaki pakiet powinien się tym zająć?

Jesse Vogt
źródło
1
Wow ... Też miałem ten problem. GCC 4.8 na ARMv7-a CubieTruck (Cortex-A7) z systemem Ubuntu. Dziwne (dla mnie) jest to, że odpowiedź Anthony'ego to naprawiła. Cokolwiek ...
jww

Odpowiedzi:

308

Dodanie tej odpowiedzi częściowo, ponieważ rozwiązało to mój problem z tym samym problemem, dzięki czemu mogę samodzielnie dodać to pytanie do zakładek.

Byłem w stanie to naprawić, wykonując następujące czynności:

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

Jeśli masz zainstalowaną wersję gcc/ g++, która nie jest domyślnie dostarczana (np. g++-4.8Na klarownym), również chcesz ją dopasować:

sudo apt-get install gcc-4.8-multilib g++-4.8-multilib
Anthony Sottile
źródło
30
Upewnij się, że pasują do wersji gcc and g++zainstalowanej w twoim systemie. Na Ubuntu 14.04 miałem gcc-4.8i g++-4.8zainstalowałem, więc zainstalowałem gcc-4.8-multilib i g++-4.8-multilibzamiast tego.
Zoltán
3
To rozwiązało mój problem podczas kompilacji z -m32 na komputerze 64-bitowym. Dzięki
nic
41
Dzięki za wskaźnik, ale sudo apt-get install gcc-multilib g++-multilibwydaje się lepszy (automatycznie rozpoznaje wersję gcc).
leesei
^ może nie! @ Sugestia Zoltana działała jednak dla mnie. Anthony Sottile, może powinieneś uwzględnić komentarz Zoltana w swojej odpowiedzi?
Mężczyzna,
@Man nie krępuje się zasugerować edycję, kiedy ją pierwotnie opublikowałem, dopasowałem wersję zadaną w pytaniu, od tego czasu zmieniła się od edycji innych
Anthony Sottile
11

Próbowałeś dodać -I/usr/include/c++/4.4/i486-linux-gnulub -I/usr/include/c++/4.4/i686-linux-gnu?

orlp
źródło
To naprawdę działa. Masz pomysł, dlaczego miałbym to robić tylko dla wersji 64-bitowej? Próbuję skonfigurować tę maszynę, aby pomagała w rozproszonych kompilacjach 64-bitowych i chcę uniknąć zbytniego dostosowywania.
Jesse Vogt,
2
Przepraszam, nie mam pojęcia, po prostu postawiłem szybkie,
zuchwałe
5

Podczas kompilacji w RHEL 6.2 (x86_64) zainstalowałem zarówno 32-bitowe, jak i 64-bitowe pakiety libstdc ++ - dev, ale miałem problem z „c ++ config.h brak takiego pliku lub katalogu ”.

Rozkład:

/usr/include/c++/4.4.6/x86_64-redhat-linuxBrakowało katalogu .

Zrobiłem następujące:

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

Teraz jestem w stanie skompilować 32-bitowe pliki binarne na 64-bitowym systemie operacyjnym.

Pekmez
źródło
1
Zrobiłem to na OpenSUSEcd /usr/include/c++/4.6;ln -s x86_64-suse-linux i586-suse-linux
Julian
3

Wygląda na błąd literowy w tym pakiecie gcc. Rozwiązanie:

mv /usr/include/c++/4.x/i486-linux-gnu /usr/include/c++/4.x/i686-linux-gnu/64
Taniec taniec
źródło
2

W moim 64-bitowym systemie zauważyłem, że istnieje następujący katalog:

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

To miałoby sens, że w moim 32-bitowym systemie, który został skonfigurowany do 64-bitowej kompilacji krzyżowej, powinien istnieć odpowiedni katalog, taki jak:

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

Sprawdziłem dwukrotnie i ten katalog nie istniał. Uruchamianie g++z pełnym parametrem pokazało, że kompilator faktycznie szukał czegoś w tej lokalizacji:

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.

Błąd dotyczący ignoring nonexistent directorybył wskazówką. Niestety, wciąż nie wiem, jaki pakiet muszę zainstalować, aby ten katalog się pojawił, więc właśnie skopiowałem /usr/include/c++/4.4/x86_64-linux-gnu/bitskatalog z mojego 64-bitowego komputera /usr/include/c++/4.4/i686-linux-gnu/64/bitsna mój 32.

Teraz kompilacja tylko z -m64działaniem poprawnie. Główną wadą jest to, że nadal nie jest to właściwy sposób na robienie rzeczy i wydaje mi się, że następnym razem Update Manager instaluje się i aktualizacja do g ++ może się zepsuć.

Jesse Vogt
źródło
1

Zasadniczo jest on stosowany w problemach HeapOverflows lub innych typach odwracania, tj. Jeśli chcesz zmienić 64-bitowy ELF na 32-bitowy ELF i wyświetla błąd podczas konwersji.

Możesz po prostu uruchomić polecenia

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

który zaktualizuje biblioteki Uaktualnione pakiety:

Zainstalowane zostaną następujące dodatkowe pakiety: 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 libx32dd1 ++ 6 libx32ds1-6 8-dbg glibc-doc Zainstalowane zostaną następujące NOWE pakiety:g ++ - 8-multilib g ++ - multilib gcc-8-multilib gcc-multilib lib32asan5 lib32atomic1 lib32gcc-8-dev lib32gomp1 lib32itm1 lib32mpx2 lib32quadmath0 lib32stdc ++ - 8-dev lib32ubsan1 libc6-dev-i386 lib32 x 8-dev libx32gcc1 libx32gomp1 libx32itm1 libx32quadmath0 libx32stdc ++ - 8-dev libx32stdc ++ 6 libx32ubsan1

podobny do tego zostanie pokazany terminalowi

Luftatako
źródło
0

Z mojego doświadczenia sudo apt-get install gcc-multilib g++-multilibpomaga. Ale moim kolejnym problemem jest to, że ZAPOMNIAŁEM wyczyścić katalog, więc nadal pojawia się ten sam błąd. Po raz pierwszy używamy clang lub cmake. Więc po prostu usuwam mój oryginalny katalog i ponownie kompiluję i działa. Mam nadzieję, że to pomaga komuś takiemu jak ja.

Konsekwencja
źródło