Итак, когда мы делаем следующее:
#include <stdio.h>
против
#include "myFile.h"
компилятор, в моем случае GCC, знает, где этот stdio.h (и даже объектный файл) находится на моем жестком диске. Он просто использует эти файлы без моего вмешательства.
Я думаю, что на моей машине Ubuntu Linux эти файлы хранятся в /usr/include/
. Как компилятор узнает, где искать эти файлы? Можно ли это настроить или это просто ожидаемое значение по умолчанию? Где мне искать эту конфигурацию?
Поскольку я задаю вопрос об этих включаемых файлах, каковы исходные тексты этих файлов? Я знаю, что в сообществе Linux это может быть неясно, но кто управляет ими? Кто мог бы предоставить и управлять теми же файлами для компилятора Windows.
У меня всегда было впечатление, что они приходят с компилятором, но это было предположение...
См. здесь: Путь поиска
Резюме:
#include <stdio.h>
Когда включаемый файл находится в скобках, препроцессор сначала ищет в путях, указанных с помощью флага -I. Затем он ищет по стандартным путям include (см. вышеуказанную ссылку и используйте флаг -v для проверки на вашей системе).
#include "myFile.h"
Если включаемый файл заключен в кавычки, препроцессор сначала ищет в текущем каталоге, затем в путях, указанных -iquote, затем в путях -I, затем в стандартных путях.
Можно использовать -nostdinc, чтобы препроцессор вообще не искал по стандартным путям.
Переменные окружения также могут быть использованы для добавления путей поиска.
При компиляции, если вы используете флаг -v, вы можете увидеть используемые пути поиска.
gcc - это богатая и сложная "оркестровая" программа, которая вызывает множество других программ для выполнения своих обязанностей. Для конкретной цели посмотреть, где #include "goo" и
#include
$ touch a.c
$ gcc -v -E a.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.
# 1 "a.c"
Это один из способов посмотреть списки поиска включаемых файлов, включая (если есть) каталоги, в которых #include "..."будет искать, а
#include <...>не будет. Этот конкретный список я показываю на Mac OS X (aka Darwin), но команды, которые я рекомендую, покажут вам списки поиска (а также интересные детали конфигурации, которые я заменил на
...` здесь;-) на любой системе, на которой gcc работает правильно.
Карл ответил на ваш вопрос о пути поиска, но что касается "источника файлов", то следует знать, что если вы установите пакет libfoo
и захотите заниматься разработкой с ним (т.е. использовать его заголовки), вам также потребуется установить libfoo-dev
. Заголовочные файлы стандартной библиотеки уже находятся в /usr/include
, как вы видели.
Обратите внимание, что некоторые библиотеки с большим количеством заголовков устанавливают их в подкаталог, например, /usr/include/openssl
. Чтобы включить одну из них, просто укажите путь без части /usr/include
, например:
#include <openssl/aes.h>
В \#Включить файлов ССЗ хранятся в/usr/включать . Стандартные включаемые файлы с G++ хранятся в/usr/включать/с++
.