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.
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:
`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
cpp
zamiast 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
/dev/null
, tak `gcc -print-prog-name=cc1` -v < /dev/null
.
Ctrl
+ D
, który wysyła „koniec pliku” w Unix-talk.
Ponadto gcc będzie przeglądać katalogi określone po -I
opcji.
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
echo "#include <bogus.h>" | gcc -v -x c -
gcc -v -E - < /dev/null
lub cpp -v < /dev/null
wystarczą. 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.)
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.
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 -I
opcje -rodzin w linii poleceń, będą one miały wpływ na to, co zostanie wydrukowane.
( sed
Polecenie polega na usunięciu wszystkich innych śmieci, które drukuje to wywołanie, i LC_ALL=C
ma na celu zapewnienie, że sed
polecenie zadziała - frazy „zaczyna się tutaj” i „Lista końca wyszukiwania” są tłumaczone na IIRC.)
g++ -print-search-dirs
gcc -print-search-dirs
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
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
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.