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.

Bill jaszczurka
źródło

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
Drew Dormann
źródło
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.


Robert
źródło
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
diciu
źródło
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.

Bill jaszczurka
źródło
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” tłumaczone na IIRC.)

zwol
źródło
9
g++ -print-search-dirs
gcc -print-search-dirs
użytkownik292283
źródło
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

Suhas Chikkanna
źródło
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
użytkownik 2844647
źródło
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.

akhil tiwari
źródło