При создании библиотеки вручную необходимо учитывать, что библиотека имеет как минимум две стороны:
- сторона реализации, которая обрабатывается cm (x) файлом для библиотеки
- сторона интерфейса, которая должна содержать файл cmi для каждого открытого модуля, предоставляемого библиотекой.
Например, если исходные файлы библиотеки состоят из
lib_src
|- a.ml
|- b.ml
|- c.ml
тогда скомпилированный интерфейс для библиотеки байт-кода может быть ограничен только A
и B
, если не выставлять b.cmi
. Таким образом, можно получить скомпилированную библиотеку со следующими файлами:
lib
|- a.cmi
|- c.cmi
|- lib.cma
На этом этапе компилируется модуль User
, который зависит от библиотеки
(* user.ml *)
printf "%d" A.x
требует как связать архив lib.cma, так и указать расположение файлов cmi
с -I
:
ocamlc -I lib lib.cma user.ml
Вторым примечательным моментом является то, что файл cma
- это просто набор файлов cmo
. Сам по себе он не реализует никаких пространств имен. Таким образом, нет Lib
модуля, введенного lib.cma
. Пространство имен обычно реализуется самой системой сборки.