Прежде всего, инструментарий, который поставляется с OCaml System Distribution (он же компилятор), является очень универсальным, но довольно низкоуровневым и должен рассматриваться как базовый уровень для построения более высокоуровневых систем сборки.Поэтому изучение его довольно сложно и обычно имеет смысл, только если вы собираетесь создавать такие системы. намного проще научиться использовать дюну или оазис или ocamlbuild .Более того, это отвлечет ваше внимание от того, что действительно имеет значение - изучения языка.
С учетом всего сказанного позвольте мне ответить на ваш вопрос более подробно.OCaml реализует отдельную схему компиляции, где каждый модуль компиляции может быть собран независимо, а затем связан в один двоичный файл.Эта схема распространена в языках C / C ++, и на самом деле, набор инструментов компилятора OCaml очень похож на набор инструментов компилятора C.
Когда вы запускаете ocamlopt -c x.ml
, вы создаете модуль компиляции, и в результате получается несколько файлов, а именно:
x.o
- содержит фактически скомпилированный компьютеркод x.cmx
- содержит данные оптимизации и другую информацию, относящуюся к компилятору x.cmi
- содержит скомпилированный интерфейс для модуля X
.
InДля того, чтобы скомпилировать модуль, компилятору не нужен код других модулей, используемых в этом модуле.Но ему нужна информация о типе, т. Е. Ему необходимо знать тип функции List.find
или тип любой другой функции, предоставляемой некоторым модулем, который является внешним по отношению к вашему модулю.Эта информация хранится в файлах cmi, для которых (скомпилированные) заголовочные файлы из C / C ++ являются ближайшим аналогом.Как и в C / C ++, компилятор ищет их в пути поиска include, который по умолчанию включает в себя текущий каталог и расположение стандартной библиотеки, но может быть расширен с помощью параметра -I
(так же, как в C / C ++).Поэтому, если ваш модуль использует другой модуль, определенный в папке A
, вам нужно указать компилятору, где его искать, например,
ocamlopt -I A -c x.ml
Созданный файл объекта не будет содержать никакого кода из внешнегомодули.Поэтому, как только вы дойдете до финальной стадии компиляции - фазы компоновки, вы должны предоставить реализацию, например, если ваш модуль X
использовал модуль, реализованный в файле с относительным путем A/y.ml
, и вы скомпилировалив этой папке, то вам нужно снова указать местоположение скомпилированной реализации, например,
ocamlopt -I A y.cmx x.cmx -o exe
Порядок важен, все модули, используемые модулем, должны быть указаны перед этим модулем, в противном случае выполучит ошибку «Нет предоставленных реализаций».
Как видите, это довольно запутанный процесс, и на самом деле не стоит тратить свое время на его изучение.Так что, если у вас есть возможность, используйте инструмент более высокого уровня для создания своих программ.Если не уверен, то выбери Дюну :)