Эрланг: В чем разница между "include_lib" и "include"?
В чем разница между "include_lib" и "include"?
например.
-include_lib("eunit/include/eunit.hrl")
Ответы
Ответ 1
Как описывает документация разница между include и include_lib заключается в следующем:
include_lib
похож на include
, но не должен указывать абсолютный файл. Вместо этого первым компонентом пути (возможно, после замены подстановки) считается имя приложения.
Пример:
-include_lib("kernel/include/file.hrl").
Сервер кода использует код: lib_dir (ядро), чтобы найти каталог текущей (последней) версии Kernel, а затем в подкаталог включен поиск файла file.hrl.
Итак, в вашем примере вам не нужно указывать версию eunit, которую вы включаете, вы включаете в себя последний eunit.hrl eunit: s, который существует в вашем пути к библиотеке.
Ответ 2
Одно отличие, которое не очевидно в первую очередь, состоит в том, что -include
и -include_lib
используют другой набор путей при поиске файлов заголовков. -include_lib
фактически использует путь кода, а не путь к файлу заголовка.
Следовательно, флаг erlc
ожидает добавления пути к пути поиска -include
: -I
; флаг -include_lib
равен -pa
/-pz
.
Уже упоминалось, что использование -include_lib
избавляет нас от указания (и, следовательно, привязки) модуля к конкретной версии библиотеки.
Кроме того, существует соглашение о том, что внутренние заголовки хранятся внутри подкаталога src/
проекта и включаются с помощью -include
. Внешние заголовки (предназначенные для использования другими библиотеками/проектами) хранятся в include/
и включаются с помощью -include_lib
.