2008-12-05 2 views
144

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

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

+1

Полезная информация! Спасибо за это. – 2008-12-05 16:58:36

ответ

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

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

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

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

`gcc -print-prog-name=cc1` -v 
16

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

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

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

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

+0

Это нормально для вашей текущей версии gcc. Фактические каталоги, которые он просматривает, зависят от параметров, заданных при создании gcc. См. Ответ Shmoopty для лучшего решения. – 2008-12-05 17:08:48

+0

PS: Мои файлы заголовков C++ находятся в: /usr/include/c++/4.0.0 – 2008-12-05 17:10:40

+2

@Martin: Вы - старая школа. Шахта находится в /usr/include/c++/4.2 :) – 2008-12-05 17:20:56

26

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


+1

Спасибо. Это хорошая информация для добавления. – 2008-12-05 16:16:00

23

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

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

echo $C_INCLUDE_PATH 

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

export C_INCLUDE_PATH=$C_INCLUDE_PATH:/usr/include 
5

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

$ 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)

1

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

каст -v

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

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

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

0

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^