Где gcc ищет файлы заголовков C и С++?

В системе Unix, где gcc ищет файлы заголовков?

Сегодня утром я потратил немного времени на поиск файлов системных заголовков, поэтому я подумал, что это будет хорошая информация, чтобы иметь здесь.

Ответ 1

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

Эта команда спрашивает gcc, какой препроцессор C++ он использует, а затем спрашивает, какой препроцессор, где он ищет, включает в себя.

Вы получите надежный ответ для вашей конкретной установки.

Аналогично, для препроцессора C:

'gcc -print-prog-name=cpp' -v

Ответ 2

Кроме того, gcc будет выглядеть в каталогах, указанных после опции -I.


Ответ 3

Вы можете создать файл, который пытается включить заголовок фальшивой системы. Если вы запускаете gcc в подробном режиме в таком источнике, он будет перечислять все местоположения системы, поскольку он ищет заголовок поддельного кода.

$ 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

Ответ 4

Раздел CPP Руководство GCC показывает, что файлы заголовков могут быть расположены в следующих каталогах:

GCC выглядит в нескольких разных местах для заголовков. В обычной системе Unix, если вы не укажете ее иначе, она будет искать заголовки, запрошенные С#include в:

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

Для программ на С++ он также будет сначала смотреть в /usr/include/g ++ - v3.

Ответ 5

Чтобы получить GCC, чтобы распечатать полный набор каталогов, где он будет искать заголовки системы, вызовите его следующим образом:

$ LC_ALL=C gcc -v -E -xc - < /dev/null 2>&1 | 
  LC_ALL=C sed -ne '/starts here/,/End of/p'

который будет выдавать результат формы

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

Если у вас есть параметры -I -family в командной строке, они будут влиять на то, что распечатывается.

(Команда sed состоит в том, чтобы избавиться от всех других нежелательных сообщений, которые вызывается, а LC_ALL=C - обеспечить выполнение команды sed - "начинается здесь" и "конец списка поиска" "фразы переведены IIRC.)

Ответ 6

g++ -print-search-dirs
gcc -print-search-dirs

Ответ 7

Набор путей, в которых компилятор ищет файлы заголовков, может быть проверен командой: -

cpp -v

Если вы объявляете #include "", компилятор сначала ищет в текущем каталоге исходного файла и, если не найден, продолжает поиск в приведенных выше каталогах.

Если вы объявляете #include < > , компилятор ищет непосредственно в тех каталогах, которые получены из приведенной выше команды.

Источник: - http://commandlinefanatic.com/cgi-bin/showarticle.cgi?article=art026

Ответ 8

Можно просмотреть (дополнительный) путь для программы C из bash, выполнив следующие шаги:

echo $C_INCLUDE_PATH

Если это пустое, оно может быть изменено для добавления местоположений включения по умолчанию:

export C_INCLUDE_PATH=$C_INCLUDE_PATH:/usr/include

Ответ 9

Это каталоги, которые gcc просматривает по умолчанию для указанных файлов заголовков (учитывая, что файлы заголовков включены в chevrons < > ); 1./usr/local/include/- используется для файлов заголовков сторонних разработчиков. 2./usr/include/- используется для файлов системных заголовков.

Если в случае, если вы решите разместить свой собственный файл заголовка в месте, отличном от указанных выше каталогов, вы можете включить их следующим образом: 1. используя кавычки ( "./custom_header_files/foo.h" ) с файловым путем вместо шевронов в инструкции include. 2. с помощью ключа -I при компиляции кода. gcc -I/home/user/custom_headers/-c foo.c -p foo.o В основном, ключ -I сообщает компилятору сначала посмотреть в каталоге, указанном с ключом -I (перед тем, как он проверяет стандартные каталоги). При использовании -I-переключателя файлы заголовков могут быть включены с использованием шевронов.