Где хранятся файлы с данными - Ubuntu Linux, GCC
Итак, когда мы делаем следующее:
#include <stdio.h>
против
#include "myFile.h"
компилятор, GCC в моем случае, знает, где этот stdio.h(и даже файл объекта) находится на моем жестком диске. Он просто использует файлы без взаимодействия со мной.
Я думаю, что на моей машине Ubuntu Linux файлы хранятся в /usr/include/
. Как компилятор знает, где искать эти файлы? Является ли это настраиваемым или это только ожидаемое значение по умолчанию? Где я буду искать эту конфигурацию?
Так как я задаю вопрос по этим включенным файлам, каков источник файлов? Я знаю, что это может быть нечетким в сообществе Linux, но кто их управляет? Кто будет предоставлять и управлять теми же файлами для компилятора Windows.
У меня всегда было впечатление, что они поставляются вместе с компилятором, но это было предположение...
Ответы
Ответ 1
Смотрите здесь: Путь поиска
Резюме:
#include <stdio.h>
Когда файл include находится в скобках, препроцессор сначала ищет пути, указанные с помощью -I. Затем он ищет стандартные пути include (см. Ссылку выше и используйте флаг -v для тестирования в вашей системе).
#include "myFile.h"
Когда включенный файл находится в кавычках, препроцессор сначала ищет в текущем каталоге, затем пути, указанные с помощью -код, затем -I, а затем стандартные пути.
-nostdinc может использоваться, чтобы препроцессор вообще не просматривал стандартные пути.
Переменные окружения также могут использоваться для добавления путей поиска.
При компиляции, если вы используете флаг -v, вы можете видеть используемые пути поиска.
Ответ 2
gcc - это богатая и сложная программа "оркестровки", которая призывает многие другие программы выполнять свои обязанности. Для того, чтобы увидеть, где #include "goo"
и #include <zap>
будут искать в вашей системе, я рекомендую:
$ 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 работает правильно.
Ответ 3
Карл ответил на ваш вопрос о пути поиска, но насколько "источник файлов" идет, нужно знать, что если вы установите пакет libfoo
и хотите сделать с ним некоторую разработку (т.е., используйте его заголовки), вам также потребуется установить libfoo-dev
. Стандартные файлы заголовков библиотеки уже находятся в /usr/include
, как вы видели.
Обратите внимание, что некоторые библиотеки с большим количеством заголовков установят их в подкаталог, например, /usr/include/openssl
. Чтобы включить один из них, просто укажите путь без части /usr/include
, например:
#include <openssl/aes.h>
Ответ 4
Файлы \#include
gcc хранятся в /usr/include
.
Стандарт включает файлы g++, хранящиеся в /usr/include/c++
.