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

W systemie Unix, gdzie gcc szuka plików nagłówkowych?

Spędziłem trochę czasu dziś rano szukając plików nagłówkowych systemu, więc pomyślałem, że to będzie dobra informacja, aby mieć tutaj.

 152
Author: MD XF, 2008-12-05

9 answers

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

To polecenie pyta gcc, którego preprocesora używa C++, a następnie pyta tego preprocesora, gdzie szuka includes.

Otrzymasz wiarygodną odpowiedź na konkretną konfigurację.

Podobnie, dla C preprocesora:

`gcc -print-prog-name=cc1` -v
 190
Author: Drew Dormann,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-05 20:01:42

Dodatkowo, gcc będzie szukać w katalogach podanych Po opcji -I.


 28
Author: robert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-13 21:01:28

Możesz utworzyć plik, który próbuje dołączyć fałszywy nagłówek systemowy. Jeśli uruchomisz gcc w trybie szczegółowym na takim źródle, wyświetli on listę wszystkich lokalizacji systemu, które szukają fałszywego nagłówka.

$ echo "#include <bogus.h> int main(){}" > 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
 23
Author: diciu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-10 17:44:51

Sekcja CPP podręcznika GCC wskazuje, ż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 go inaczej, będzie szukał nagłówków wymaganych z #include in:

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

Dla programów C++, będzie również wyglądać w /usr/include/g++-v3, najpierw.

 16
Author: Bill the Lizard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-05 16:03:23
g++ -print-search-dirs
gcc -print-search-dirs
 7
Author: user292283,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-29 14:29:59

Aby zmusić GCC do wydrukowania całego zestawu katalogów, w których będzie szukał nagłówków systemowych, wywołaj to 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 wykona wyjście 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 opcje rodziny -I w wierszu poleceń, będą one miały wpływ na to, co zostanie wydrukowane.

(sed Komenda ma na celu pozbycie się wszystkich innych śmieci, które wyświetla wywołanie, a LC_ALL=C ma na celu upewnienie się, że komenda sed działa -- "starts here" I " End of search list" frazy tłumaczone IIRC.)

 5
Author: zwol,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-02 19:48:10

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

cpp-v

Jeśli zadeklarujesz #include "" , kompilator najpierw wyszukuje w bieżącym katalogu pliku źródłowego, a jeśli nie zostanie znaleziony, kontynuuje wyszukiwanie w powyższych odzyskanych katalogach.

Jeśli zadeklarujesz #include , kompilator wyszukuje bezpośrednio w tych katalogach uzyskanych z powyższego dowództwo.

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

 2
Author: Suhas Chikkanna,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-18 13:18:27

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

echo $C_INCLUDE_PATH

Jeśli jest pusta, może być zmodyfikowana, aby dodać domyślne lokalizacje include, przez:

export C_INCLUDE_PATH=$C_INCLUDE_PATH:/usr/include
 0
Author: user2844647,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-03 23:28:20

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

Jeśli zdecydujesz się umieścić swój niestandardowy plik nagłówka w innym miejscu niż wyżej wymienione katalogi, możesz dołączyć je w następujący sposób: 1. korzystanie z cudzysłowów ("./ custom_header_files / foo.h") ze ścieżką plików, zamiast szewronów w oświadczeniu include. 2. użycie przełącznika-I podczas kompilacji kodu. gcc-i / home/user/ custom_headers / - c foo.c-P foo.o Zasadniczo przełącznik-I mówi kompilatorowi, aby najpierw zajrzał do katalogu podanego przełącznikiem-I (zanim sprawdzi standardowe katalogi).Podczas przełączania-I pliki nagłówkowe mogą być dołączane za pomocą szewronów.

 0
Author: akhil tiwari,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-09 08:02:38