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.
`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
zamiastcc1
? 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.źródło
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.
źródło
echo "#include <bogus.h>" | gcc -v -x c -
gcc -v -E - < /dev/null
lubcpp -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:
źródło
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:
który wytworzy wynik formularza
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, iLC_ALL=C
ma na celu zapewnienie, żesed
polecenie zadziała - frazy „zaczyna się tutaj” i „Lista końca wyszukiwania” są tłumaczone na IIRC.)źródło
źródło
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
źródło
Można wyświetlić (dodatkową) ścieżkę dołączania dla programu C z poziomu bash, sprawdzając, co następuje:
Jeśli jest pusty, można go zmodyfikować, aby dodać domyślne lokalizacje dołączania, przez:
źródło
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.
źródło