Компиляция модулей в разных каталогах - PullRequest
0 голосов
/ 26 июня 2019

Я пытаюсь следовать этим инструкциям для компиляции модуля, который зависит от другого модуля, который я создал: https://ocaml.org/learn/tutorials/modules.html

В моем случае у меня есть модуль ~/courseFiles/chapter5/moduleA.ml и другой модуль в ~/OCamlCommons/listMethods.ml. Я скомпилировал listMethods.ml, используя ocamlopt -c listMethods.ml, и, похоже, это сработало, он создал файл listMethods.cmx.

Файл moduleA.ml содержит open ListMethods;;. Теперь, когда мой терминал находится в ~/courseFiles/chapter5, я запустил ocamlopt -c moduleA.ml, но терминал вернул

Ошибка: несвязанный модуль ListMethods

Теперь я могу понять, почему он это сделал, но инструкции на этом сайте, кажется, указывают, что я сделал то, как вы должны это сделать. Предположительно мне нужно указать местоположение скрипта или исполняемых файлов при компиляции moduleA.ml, но я не уверен, какой должен быть синтаксис. Я попробовал несколько догадок и догадался, как я могу сделать это с ocamlfind, но у меня ничего не получилось. Я пытался найти инструкции по компиляции модулей, расположенных в разных каталогах, но ничего не нашел (или что-либо, что я могу понять в любом случае).

1 Ответ

2 голосов
/ 27 июня 2019

Прежде всего, инструментарий, который поставляется с 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

Порядок важен, все модули, используемые модулем, должны быть указаны перед этим модулем, в противном случае выполучит ошибку «Нет предоставленных реализаций».

Как видите, это довольно запутанный процесс, и на самом деле не стоит тратить свое время на его изучение.Так что, если у вас есть возможность, используйте инструмент более высокого уровня для создания своих программ.Если не уверен, то выбери Дюну :)

...