Таким образом, очевидно, что назначение различных файлов (при ограничении этого компилятором байт-кода):
mylibrary.mli
- определение интерфейса, читаемое человеком (не обязательно, компилятору нужны только .cmi)
mylibrary.cmi
- скомпилированный интерфейс, необходимый при компиляции кода, вызывающего mylibrary
library.o
- C объектный файл
dlllibrary.so
- объект разделяемой библиотеки из .o
dlllibrary.a
- статический объект библиотеки из .o
mylibrary.cmo
- объект байт-кода, скомпилированный из mylibrary.ml
mylibrary.cma
- библиотека байт-кодов
Затем mylibrary.cma
(с mylibrary.cmi
и dlllibrary.so
) необходимы при загрузке mylibrary с верхнего уровня:
#load "mylibrary.cma";;
OR
Можно скомпилировать программу с байт-кодом, которая динамически связывается с mylibrary.cma
(mylibrary.cmi
и dlllibrary.so
также необходимы):
ocamlc mylibrary.cma <program>.ml
OR
динамическое связывание с объектом байт-кода вместо библиотеки байт-кода (необходимо: mylibrary.cmo
, mylibrary.cmi
, dlllibrary.so
):
ocamlc dlllibrary.so mylibrary.cmo <program>.ml
(Примечание: затем запустите байт-код с: ocamlrun -I . <program>
, предполагая, что dlllibrary.so
находится в текущем каталоге.)
OR
статическое связывание с объектами (необходимы файлы: mylibrary.cmo
, mylibrary.cmi
liblibrary.a
)
ocamlc -custom liblibrary.a mylibrary.cmo <program>.ml
OR
статическое связывание с объектами библиотеки (необходимы файлы: mylibrary.cma
, mylibrary.cmi
, liblibrary.a
)
ocamlc -custom -I . mylibrary.cma <program>.ml
Таким образом, в зависимости от того, как в будущем планируется использовать библиотеку, нужны разные файлы. За исключением того, что .mli
требуется только для читателей-людей, а объектный файл .o
, скомпилированный из библиотеки C, не нужен (но в некоторых случаях потребуется при компиляции в нативный код).