Где gcc ищет заголовочные файлы C и C ++? - PullRequest
166 голосов
/ 05 декабря 2008

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

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

Ответы [ 9 ]

203 голосов
/ 05 декабря 2008
`gcc -print-prog-name=cc1plus` -v

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

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

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

`gcc -print-prog-name=cc1` -v
34 голосов
/ 05 декабря 2008

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


24 голосов
/ 05 декабря 2008

Вы можете создать файл, который пытается включить поддельный системный заголовок. Если вы запустите 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
17 голосов
/ 05 декабря 2008

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

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

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

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

8 голосов
/ 29 декабря 2016
g++ -print-search-dirs
gcc -print-search-dirs
8 голосов
/ 02 ноября 2015

Чтобы 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 -семейства в командной строке, они будут влиять на то, что выводится на печать.

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

3 голосов
/ 18 января 2017

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

cpp -v

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

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

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

0 голосов
/ 09 апреля 2017

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

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

0 голосов
/ 04 октября 2013

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

echo $C_INCLUDE_PATH

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

export C_INCLUDE_PATH=$C_INCLUDE_PATH:/usr/include
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...