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” 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.