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.h
plik, ale znajdują się one w katalogach i486-linux-gnu
i w i686-linux-gnu
folderze /usr/include/c++/4.4/
Nie ma c++config.h
w /usr/include/c++/bits
.
Jakieś pomysły na to, czego mi brakuje? Kompilacja bez -m64
flagi 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/64
który powinien zawierać nazwany podkatalog zawierający bits
brakujący plik dołączania. Wiesz, jaki pakiet powinien się tym zająć?
źródło
Odpowiedzi:
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:
Jeśli masz zainstalowaną wersję
gcc
/g++
, która nie jest domyślnie dostarczana (np.g++-4.8
Na klarownym), również chcesz ją dopasować:źródło
gcc and g++
zainstalowanej w twoim systemie. Na Ubuntu 14.04 miałemgcc-4.8
ig++-4.8
zainstalowałem, więc zainstalowałemgcc-4.8-multilib
ig++-4.8-multilib
zamiast tego.sudo apt-get install gcc-multilib g++-multilib
wydaje się lepszy (automatycznie rozpoznaje wersję gcc).Próbowałeś dodać
-I/usr/include/c++/4.4/i486-linux-gnu
lub-I/usr/include/c++/4.4/i686-linux-gnu
?źródło
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-linux
Brakowało katalogu .Zrobiłem następujące:
Teraz jestem w stanie skompilować 32-bitowe pliki binarne na 64-bitowym systemie operacyjnym.
źródło
cd /usr/include/c++/4.6;ln -s x86_64-suse-linux i586-suse-linux
Wygląda na błąd literowy w tym pakiecie gcc. Rozwiązanie:
źródło
W moim 64-bitowym systemie zauważyłem, że istnieje następujący katalog:
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:
Sprawdziłem dwukrotnie i ten katalog nie istniał. Uruchamianie
g++
z pełnym parametrem pokazało, że kompilator faktycznie szukał czegoś w tej lokalizacji:Błąd dotyczący
ignoring nonexistent directory
był 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/bits
katalog z mojego 64-bitowego komputera/usr/include/c++/4.4/i686-linux-gnu/64/bits
na mój 32.Teraz kompilacja tylko z
-m64
dział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ć.źródło
Ten błąd został naprawiony w „gcc-4.6”.
https://bugs.launchpad.net/ubuntu/+source/gcc-4.5/+bug/793411
źródło
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
który zaktualizuje biblioteki Uaktualnione pakiety:
podobny do tego zostanie pokazany terminalowi
źródło
Z mojego doświadczenia
sudo apt-get install gcc-multilib g++-multilib
pomaga. 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.źródło