Gdzie jest mój katalog / usr / include / sys?


13

Niedawno zaktualizowałem Kubuntu 12.04 do 13.04, kompletna ponowna instalacja.

Korzystanie z gcc 4.7.3. Skompilowałem kilka programów, aby odkryć, że nie ma /usr/include/syskatalogu. Oznacza to, że types.h, stat.hitd, są nieobecne. Istnieją w include/linuxkatalogu, ale nie include/sys.

Co się dzieje?


Jaki komunikat o błędzie drukuje GCC? Proszę edytować pytanie do świadczenia tych i innych informacji związanych z Twoim problemem.
edwin

1
Czy masz zainstalowaną wersję niezbędną?
Seth

Kilka programów, które próbowałem skompilować dobrze, więc nie ma komunikatu o błędzie z gcc. Po prostu nie wiem, skąd pochodzi nagłówek. Mam edytor, który buduje odwołania do funkcji i syscall itp. I nie jest szczęśliwy, że nie może znaleźć katalogu.
Kaczka

1
Tak, niezbędne do kompilacji jest aktualne.
Kaczka

Odpowiedzi:


13

Jeśli używasz Ubuntu w wersji 64-bitowej (nie mogę teraz pisać dokładnie w systemie 32-bitowym), katalog z pytaniem to:

/usr/include/x86_64-linux-gnu/sys

Teraz, mając te informacje, możesz utworzyć dowiązania symboliczne do tych plików, jeśli naprawdę potrzebujesz ich w tej lokalizacji ( /usr/include/sys), używając tego na terminalu:

sudo ln -s /usr/include/x86_64-linux-gnu/sys/types.h /usr/include/sys/types.h
sudo ln -s /usr/include/x86_64-linux-gnu/sys/stat.h /usr/include/sys/stat.h

# ...etc

Tak, 64-bitowy. Przeczytałem coś podobnego gdzie indziej i wydaje się, że wszystko jest w tym katalogu, ale nie jestem pewien, w jaki sposób nagłówki są uwzględniane z „#include sys / stat.h” do katalogu x86_64 / sys. Czy to jest jakaś nowa funkcja wtłaczania gcc? Nie widzę żadnych dowiązań symbolicznych itp., Które (zewnętrznie) prowadziłyby do takiego zachowania.
Kaczka

Wygląda na to, że mijaliśmy się na wietrze. Tak więc sedno jest takie, że kompilator robi magię, ale być może będę musiał użyć hacków dowiązań symbolicznych, aby mój edytor był szczęśliwy?
Kaczka

@Duck Właśnie edytowałem swoją odpowiedź przed 2 min twoich komentarzy :)
Radu Rădeanu

5

zainstaluj libc6-dev-amd64, jeśli pracujesz na 64-bitowym systemie Linux. Wpisz następujące polecenie w terminalu ubuntu:

sudo apt-get install libc6-dev-amd64

1

katalog sys to katalog nagłówkowy systemu unix / linux z wieloma poleceniami systemowymi. Różne marki / wersje Linux mogą umieścić go w różnych miejscach. Następujące polecenie może ci pomóc:

find /usr/include -type d -name sys
On my ubuntu 16 got the two
/usr/include/bsd/sys
/usr/include/x86_64-linux-gnu/sys

Pierwszy z nich zawiera nagłówki systemu unix BSD.
Drugi to katalog zawierający 64-bitowe głowice systemu Linux.

Mam problemy z tym, że cmake nie może znaleźć pliku sys / stat.h. Moim tymczasowym rozwiązaniem jest utworzenie dowiązania symbolicznego

/user/local/include/sys/stat.h from /usr/include/x86_64-linux-gnu/sys/stat.h

Nie chcę zanieczyszczać katalogu / usr / include i tworzę tylko łącze do jednego konkretnego pliku nagłówka, a nie do całego katalogu sys. Myślę, że jest to wada cmake, więc ma minimalny wpływ, tworząc tylko jeden link. Mam nadzieję, że może to pomóc tym, którzy cierpią z powodu tego samego problemu.


1

Sprawdźmy, jaka jest domyślna ścieżka wyszukiwania gcc. Z tej odpowiedzi otrzymujemy następujące polecenie:

gcc -xc -E -v -

Na końcu danych wyjściowych widzę to na moim komputerze:

ignoring nonexistent directory "/usr/local/include/x86_64-linux-gnu"
ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../x86_64-linux-gnu/include"
#include "..." search starts here:
#include <...> search starts here:
 /usr/lib/gcc/x86_64-linux-gnu/4.8/include
 /usr/local/include
 /usr/lib/gcc/x86_64-linux-gnu/4.8/include-fixed
 /usr/include/x86_64-linux-gnu
 /usr/include

Zwróć uwagę na ostatnią linię. Oznacza to, że kiedy skompilujesz plik C #include <sys/stat.h>, gcc będzie szukał /usr/include/x86_64-linux-gnu/sys/stat.hprzed próbą /usr/include/sys/stat.h, bez konieczności niczego dowiązania symbolicznego.


0

Ponieważ moja architektura to amd64, nie ma libc6-dev-amd64. Pakiet do zainstalowania to libc6-dev-i386.

To naprawiło zależność dla pakietu CPAN.


„Ponieważ moją architekturą jest amd64, nie ma libc6-dev-amd64” : co masz na myśli?
Marc Vanhoomissen

Mam na myśli to, że w architekturze x86_64 biblioteki / jądro / etc. pakiety mają architekturę amd64. Dlatego libc6-dev-amd64 nie jest dostępny do zainstalowania. Problem nadal występuje, niektóre programy spodziewają się zobaczyć / usr / include / sys /.
Jari Turkia
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.