Где хранятся включаемые файлы - Ubuntu Linux, GCC - PullRequest
65 голосов
/ 02 августа 2009

Итак, когда мы делаем следующее:

#include <stdio.h>

против

#include "myFile.h"

компилятор, в моем случае GCC, знает, где находится этот stdio.h (и даже объектный файл) на моем жестком диске. Он просто использует файлы без моего участия.

Я думаю , что на моем компьютере с Ubuntu Linux файлы хранятся в /usr/include/. Как компилятор узнает, где искать эти файлы? Это настраивается или это только ожидаемое значение по умолчанию? Где бы я искал эту конфигурацию?

Поскольку я задаю вопрос об этих включаемых файлах, каков источник этих файлов? Я знаю, что это может быть нечетким в сообществе Linux, но кто управляет этим? Кто будет предоставлять и управлять теми же файлами для компилятора Windows.

У меня всегда было впечатление, что они поставляются с компилятором, но это было предположение ...

Ответы [ 4 ]

44 голосов
/ 02 августа 2009

Смотрите здесь: Путь поиска

Резюме:

#include <stdio.h>

Когда включаемый файл в скобках, препроцессор сначала ищет пути, указанные с помощью флага -I . Затем он ищет стандартные пути включения (см. Приведенную выше ссылку и используйте флаг -v для проверки в вашей системе).

#include "myFile.h"

Когда включаемый файл находится в кавычках, препроцессор сначала ищет в текущем каталоге, затем пути, заданные -iquote , затем -I , затем стандартные пути.

-nostdinc может использоваться для предотвращения поиска препроцессором стандартных путей.

Переменные среды также можно использовать для добавления путей поиска.

При компиляции, если вы используете флаг -v , вы можете увидеть используемые пути поиска.

43 голосов
/ 02 августа 2009

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 (он же Darwin), но команды, которые я рекомендую, покажут вам списки поиска (а также интересные детали конфигурации, которые я заменил на ... здесь ;-) на любом система, в которой gcc работает правильно.

10 голосов
/ 02 августа 2009

Карл ответил на ваш вопрос о поисковом пути, но, что касается «источника файлов», следует помнить одну вещь: если вы устанавливаете пакет libfoo и хотите с ним что-то разработать (т.е. , используйте его заголовки), вам также необходимо установить libfoo-dev. Заголовочные файлы стандартной библиотеки уже находятся в /usr/include, как вы видели.

Обратите внимание, что некоторые библиотеки с большим количеством заголовков будут устанавливать их в подкаталог, например, /usr/include/openssl. Чтобы включить один из них, просто укажите путь без части /usr/include, например:

#include <openssl/aes.h>
2 голосов
/ 03 октября 2014

Файлы \#include gcc хранятся в /usr/include. Стандартные включаемые файлы g ++ хранятся в /usr/include/c++.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...