В системе Unix, где gcc ищет файлы заголовков?
Сегодня утром я потратил немного времени на поиск файлов системных заголовков, поэтому я подумал, что это будет хорошая информация, чтобы иметь здесь.
В системе Unix, где gcc ищет файлы заголовков?
Сегодня утром я потратил немного времени на поиск файлов системных заголовков, поэтому я подумал, что это будет хорошая информация, чтобы иметь здесь.
'gcc -print-prog-name=cc1plus' -v
Эта команда спрашивает gcc, какой препроцессор C++ он использует, а затем спрашивает, какой препроцессор, где он ищет, включает в себя.
Вы получите надежный ответ для вашей конкретной установки.
Аналогично, для препроцессора C:
'gcc -print-prog-name=cpp' -v
Кроме того, gcc будет выглядеть в каталогах, указанных после опции -I
.
Вы можете создать файл, который пытается включить заголовок фальшивой системы. Если вы запускаете 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
Раздел CPP Руководство GCC показывает, что файлы заголовков могут быть расположены в следующих каталогах:
GCC выглядит в нескольких разных местах для заголовков. В обычной системе Unix, если вы не укажете ее иначе, она будет искать заголовки, запрошенные С#include в:
/usr/local/include
libdir/gcc/target/version/include
/usr/target/include
/usr/include
Для программ на С++ он также будет сначала смотреть в /usr/include/g ++ - v3.
Чтобы получить 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.)
g++ -print-search-dirs
gcc -print-search-dirs
Набор путей, в которых компилятор ищет файлы заголовков, может быть проверен командой: -
cpp -v
Если вы объявляете #include "", компилятор сначала ищет в текущем каталоге исходного файла и, если не найден, продолжает поиск в приведенных выше каталогах.
Если вы объявляете #include < > , компилятор ищет непосредственно в тех каталогах, которые получены из приведенной выше команды.
Источник: - http://commandlinefanatic.com/cgi-bin/showarticle.cgi?article=art026
Можно просмотреть (дополнительный) путь для программы C из bash, выполнив следующие шаги:
echo $C_INCLUDE_PATH
Если это пустое, оно может быть изменено для добавления местоположений включения по умолчанию:
export C_INCLUDE_PATH=$C_INCLUDE_PATH:/usr/include
Это каталоги, которые 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-переключателя файлы заголовков могут быть включены с использованием шевронов.