Как вы создаете и используете файл .cma? - PullRequest
0 голосов
/ 17 ноября 2018

Я создаю файл .cma с:

ocamlc -o ./_build/myLib.cma -a ./_build/myBtree.cmo

Но, как ни старайся, я не могу использовать этот файл.Я продолжаю получать сообщение «Ошибка: Unbound module MyLib».

Может кто-нибудь опубликовать простой пример, который использует ocamlc (пожалуйста, не используйте примеры утилит сборки) для создания файла .cma, а затем используйте этот файл .cma в байт-кодеисполняемый файл.

Полностью потерян ...

1 Ответ

0 голосов
/ 18 ноября 2018

При создании библиотеки вручную необходимо учитывать, что библиотека имеет как минимум две стороны:

  • сторона реализации, которая обрабатывается 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. Пространство имен обычно реализуется самой системой сборки.

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