В системе Unix, где gcc ищет заголовочные файлы?
Сегодня утром я потратил немного времени на поиск некоторых системных заголовочных файлов, так что я подумал, что это будет хорошей информацией для вас.
`gcc -print-prog-name=cc1plus` -v
Эта команда спрашивает gcc, какой препроцессор C ++ он использует, а затем спрашивает, какой препроцессор там, где он ищет, включает.
Вы получите надежный ответ для вашей конкретной установки.
Аналогично для препроцессора C :
`gcc -print-prog-name=cpp` -v
cpp
вместоcc1
? На моем дебиане Джесси$(gcc -print-prog-name=cpp) -v
(правильно) дает еще один путь, который/usr/include/x86_64-linux-gnu
/dev/null
, так что`gcc -print-prog-name=cc1` -v < /dev/null
.Ctrl
+D
, что отправляет «конец файла» в Unix-talk.Кроме того, gcc будет искать в каталогах, указанных после
-I
опции.источник
Вы можете создать файл, который пытается включить поддельный системный заголовок. Если вы запустите gcc в подробном режиме для такого источника, он перечислит все местоположения системного включения, как и ищет поддельный заголовок.
источник
echo "#include <bogus.h>" | gcc -v -x c -
gcc -v -E - < /dev/null
илиcpp -v < /dev/null
достаточно. Вы просто должны получить препроцессор работать , это не имеет значения , что он видит вход. (Пути поиска печатаются во время запуска, прежде чем он даже смотрит на свои входные данные.)CPP Раздел в руководстве GCC указывает , что файлы заголовков могут быть расположены в следующих каталогах:
источник
Чтобы заставить GCC распечатать полный набор каталогов, где он будет искать системные заголовки, вызовите его так:
который будет производить вывод формы
Если
-I
в командной строке есть параметры -family, они будут влиять на то, что выводится на печать.(The
sed
команда , чтобы избавиться от всех других барахла этого розария печатает, иLC_ALL=C
чтобы убедиться , что вsed
командных произведениях - «начинается здесь» и «Конец списка результатов поиска» фразы будут переведены IIRC) .источник
источник
Набор путей, по которым компилятор ищет файлы заголовков, можно проверить с помощью команды: -
CPP-V
Если вы объявляете #include "" , компилятор сначала ищет в текущем каталоге исходного файла и, если не найден, продолжает поиск в вышеупомянутых найденных каталогах.
Если вы объявляете #include <> , компилятор выполняет поиск непосредственно в тех каталогах, которые были получены из приведенной выше команды.
Источник: - http://commandlinefanatic.com/cgi-bin/showarticle.cgi?article=art026
источник
Можно посмотреть (дополнительный) путь включения для программы на C из bash, проверив следующее:
Если это поле пустое, его можно изменить, добавив местоположения включения по умолчанию:
источник
Это каталоги, которые 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 файлы заголовков могут быть включены с помощью шевронов.
источник