Gdzie gcc szuka plików nagłówkowych C i C ++?


186

Gdzie w systemie Unix gcc szuka plików nagłówkowych?

Dziś rano spędziłem trochę czasu na poszukiwaniu plików nagłówków systemowych, więc pomyślałem, że to dobra informacja.

Odpowiedzi:


227
`gcc -print-prog-name=cc1plus` -v

To polecenie pyta gcc, jakiego używa preprocesora C ++ , a następnie pyta, czy preprocesor, w którym szuka, obejmuje.

Otrzymasz wiarygodną odpowiedź na swoją konkretną konfigurację.

Podobnie w przypadku preprocesora C :

`gcc -print-prog-name=cpp` -v

2
Co znaczy `s? Trudno mi tego szukać.
— mijiturka


5
Wydaje mi się, że preprocesor C jest cppzamiast cc1? Na moim debianie jessie $(gcc -print-prog-name=cpp) -v(poprawnie) podaje jeszcze jedną ścieżkę, którą jest/usr/include/x86_64-linux-gnu
— wlnirvana

3
Jeśli chcesz, aby nie spędzać czas oczekiwania na wejście, wejście od przekierowania /dev/null, tak `gcc -print-prog-name=cc1` -v < /dev/null.
— Steve Jorgensen

@SteveJorgensen tak! Lub naciśnij Ctrl+ D, który wysyła „koniec pliku” w Unix-talk.
— Drew Dormann,

40

Ponadto gcc będzie przeglądać katalogi określone po -Iopcji.



4
@totaam: Sprawdź swoją czcionkę! Ta odpowiedź używa „-I” (wielkie „oko”), a nie „-l” (małe „ell”).

3
-I jest dla <anglebracketed.h> natomiast -iquote jest dla „quotedfiles.h”
— jcomeau_ictx

28

Możesz utworzyć plik, który próbuje dołączyć fałszywy nagłówek systemu. Jeśli uruchomisz gcc w trybie gadatliwym na takim źródle, wyświetli ono listę wszystkich lokalizacji zawierających system w poszukiwaniu fałszywego nagłówka.

$ echo "#include <bogus.h>" > t.c; gcc -v t.c; rm t.c

[..]

#include "..." search starts here:
#include <...> search starts here:
 /usr/local/include
 /usr/lib/gcc/i686-apple-darwin9/4.0.1/include
 /usr/include
 /System/Library/Frameworks (framework directory)
 /Library/Frameworks (framework directory)
End of search list.

[..]

t.c:1:32: error: bogus.h: No such file or directory

3
Myślę, że byłoby to bardziej pomocne, gdybyś powiedział „użyj opcji -v”.
— Jay Conrod,

Cóż, jeśli użyjesz „-v” bez pliku C, który zawiera nieistniejący nagłówek systemowy, nie spowoduje to, że gcc będzie iterować przez wszystkie ścieżki dołączania. Kluczem do mojej odpowiedzi jest fikcja .h wymieniona jako nagłówek systemu.
— diciu

@Jay - masz rację, to było zbyt niejasne - wyjaśniłem, co robiłem w skrypcie powłoki.
— diciu,

9
bez plików tymczasowych:echo "#include <bogus.h>" | gcc -v -x c -
— thejoshwolfe

2
gcc -v -E - < /dev/nulllub cpp -v < /dev/nullwystarczą. Po prostu trzeba uzyskać preprocesor do uruchomienia , to nie ma znaczenia, co wejście widzi. (Ścieżki wyszukiwania są drukowane podczas uruchamiania, zanim jeszcze spojrzy na dane wejściowe.)
— zwolnij

17

CPP Sekcja z podręcznika GCC oznacza, że pliki nagłówkowe mogą znajdować się w następujących katalogach:

GCC szuka nagłówków w kilku różnych miejscach. W normalnym systemie uniksowym, jeśli nie poinstruujesz inaczej, poszuka nagłówków wymaganych przez #include w:

 /usr/local/include
 libdir/gcc/target/version/include
 /usr/target/include
 /usr/include

W przypadku programów w C ++ najpierw będzie szukał / usr / include / g ++ - v3.


W porządku dla twojej obecnej wersji gcc. Rzeczywiste katalogi, w których szuka, zależą od opcji określonych podczas budowania gcc. Zobacz odpowiedź Shmoopty, aby uzyskać lepsze rozwiązanie.
— Martin York,

PS: Moje pliki nagłówkowe C ++ znajdują się w: /usr/include/c++/4.0.0
— Martin York,

3
@Martin: Jesteś starą szkołą. Moje są w /usr/include/c++/4.2 :)
— Bill the Lizard

10

Aby GCC wydrukowało pełny zestaw katalogów, w których będzie szukał nagłówków systemowych, wywołaj go w następujący sposób:

$ LC_ALL=C gcc -v -E -xc - < /dev/null 2>&1 | 
  LC_ALL=C sed -ne '/starts here/,/End of/p'

który wytworzy wynik formularza

#include "..." search starts here:
#include <...> search starts here:
 /usr/lib/gcc/x86_64-linux-gnu/5/include
 /usr/local/include
 /usr/lib/gcc/x86_64-linux-gnu/5/include-fixed
 /usr/include/x86_64-linux-gnu
 /usr/include
End of search list.

Jeśli masz -Iopcje -rodzin w linii poleceń, będą one miały wpływ na to, co zostanie wydrukowane.

( sedPolecenie polega na usunięciu wszystkich innych śmieci, które drukuje to wywołanie, i LC_ALL=Cma na celu zapewnienie, że sedpolecenie zadziała - frazy „zaczyna się tutaj” i „Lista końca wyszukiwania” są tłumaczone na IIRC.)


9
g++ -print-search-dirs
gcc -print-search-dirs

3
Te polecenia drukują domyślne ścieżki wyszukiwania dla bibliotek linków i wewnętrznych komponentów kompilatora; nic nie mówią o plikach nagłówkowych.
— zwolnienie

6

Zestaw ścieżek, w których kompilator szuka plików nagłówkowych, można sprawdzić za pomocą polecenia: -

cpp -v

Jeśli zadeklarujesz #include „” , kompilator najpierw przeszuka bieżący katalog pliku źródłowego, a jeśli nie zostanie znaleziony, będzie kontynuował wyszukiwanie w pobranych wyżej katalogach.

Jeśli zadeklarujesz #include <> , kompilator będzie wyszukiwał bezpośrednio w katalogach uzyskanych z powyższego polecenia.

Źródło: - http://commandlinefanatic.com/cgi-bin/showarticle.cgi?article=art026


1

Można wyświetlić (dodatkową) ścieżkę dołączania dla programu C z poziomu bash, sprawdzając, co następuje:

echo $C_INCLUDE_PATH

Jeśli jest pusty, można go zmodyfikować, aby dodać domyślne lokalizacje dołączania, przez:

export C_INCLUDE_PATH=$C_INCLUDE_PATH:/usr/include

1

Są to katalogi, w których gcc domyślnie szuka określonych plików nagłówkowych (biorąc pod uwagę, że pliki nagłówkowe są zawarte w szewronach <>); 1. / usr / local / include / --used dla plików nagłówkowych innych firm. 2. / usr / include / - używany do plików nagłówka systemu.

Jeśli zdecydujesz się umieścić niestandardowy plik nagłówka w miejscu innym niż wyżej wymienione katalogi, możesz dołączyć je w następujący sposób: 1. używając cudzysłowów („./custom_header_files/foo.h”) ze ścieżką do pliku zamiast szewronów w instrukcji include. 2. przy użyciu przełącznika -I podczas kompilowania kodu. gcc -I / home / user / custom_headers / -c foo.c -p foo.o Zasadniczo przełącznik -I każe kompilatorowi najpierw zajrzeć do katalogu określonego przełącznikiem -I (zanim sprawdzi standardowe katalogi). za pomocą przełącznika -I pliki nagłówków można dołączać za pomocą szewronów.

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.