В системе Unix, где gcc ищет файлы заголовков?Где gcc ищет файлы заголовков C и C++?
Я потратил немного времени этим утром на поиск файлов системных заголовков, поэтому я подумал, что это будет хорошая информация, чтобы иметь здесь.
В системе Unix, где gcc ищет файлы заголовков?Где gcc ищет файлы заголовков C и C++?
Я потратил немного времени этим утром на поиск файлов системных заголовков, поэтому я подумал, что это будет хорошая информация, чтобы иметь здесь.
`gcc -print-prog-name=cc1plus` -v
Эта команда задает GCC, который C++ препроцессор, который он использует, а затем спрашивает, что препроцессор, где он ищет включает.
Вы получите надежный ответ для своей конкретной установки.
Аналогично, для C препроцессора:
`gcc -print-prog-name=cc1` -v
CPP Section из GCC Manual указывает, что файлы заголовков могут быть расположены в следующих каталогах:
НКУ выглядит в нескольких различных местах, для заголовков. В нормальной системе Unix, если вы не учите его иначе, он будет искать заголовки запрашиваемых с #include в:
/usr/local/include
libdir/gcc/target/version/include
/usr/target/include
/usr/include
Для программ на C++, он также будет выглядеть в/Сначала usr/include/g ++ - v3.
Это нормально для вашей текущей версии gcc. Фактические каталоги, которые он просматривает, зависят от параметров, заданных при создании gcc. См. Ответ Shmoopty для лучшего решения. – 2008-12-05 17:08:48
PS: Мои файлы заголовков C++ находятся в: /usr/include/c++/4.0.0 – 2008-12-05 17:10:40
@Martin: Вы - старая школа. Шахта находится в /usr/include/c++/4.2 :) – 2008-12-05 17:20:56
Кроме того, GCC будет выглядеть в каталогах, указанных после параметра -I
.
Спасибо. Это хорошая информация для добавления. – 2008-12-05 16:16:00
Вы можете создать файл, который пытается включить заголовок фальшивой системы. Если вы запускаете 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
Можно просмотреть (дополнительный) включает в себя путь для программы C от Баша, проверяя следующее:
echo $C_INCLUDE_PATH
Если это пуст, его можно изменить, чтобы добавить местоположения по умолчанию, по умолчанию:
export C_INCLUDE_PATH=$C_INCLUDE_PATH:/usr/include
Чтобы получить НКУ распечатать полный набор каталогов, где он будет искать системные заголовки, вызовите его следующим образом:
$ 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)
g++ -print-search-dirs
gcc -print-search-dirs
множество путей, где компилятор ищет файлы заголовков можно проверить с помощью команды: -.
каст -v
Если вы объявляете #include «», компилятор сначала ищет в текущем каталоге исходного файла и если он не найден, продолжает искать в указанных выше извлекаемых каталогов.
Если вы объявляете #include <>, поиски компилятор непосредственно в этих каталогах, полученных из приведенной выше команды.
Источник: - http://commandlinefanatic.com/cgi-bin/showarticle.cgi?article=art026
Эти каталоги, которые НКУ выглядит, по умолчанию для указанных файлов заголовков (учитывая, что файлы заголовков включаются в шевронов <>); 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 файлы заголовков могут быть включены с использованием шевронов.
Полезная информация! Спасибо за это. – 2008-12-05 16:58:36