Несвязанные модули в OCaml - PullRequest
       22

Несвязанные модули в OCaml

19 голосов
/ 03 октября 2010

Моя проблема в том, что ocamlc и ocamlopt apear отказываются находить сторонние библиотеки, установленные через apt-get. Впервые у меня появилась эта проблема, когда я попытался включить сторонние модули в свои собственные программы OCaml, и быстро списал ее как личный недостаток в понимании компиляции OCaml. Вскоре, однако, я столкнулся с той же проблемой, пытаясь скомпилировать проекты других людей в соответствии с их собственными инструкциями.

Вот самый простой пример. Все остальные используют ocamlbuild, который немного запутывает вещи.

Программа: http://groups.google.com/group/fa.caml/msg/5aee553df34548e2

Компиляция:

$ocamlc -g -dtypes -pp camlp4oof -I +camlp4 dynlink.cma camlp4lib.cma -cc g++ llvm.cma llvm_bitwriter.cma minml.ml -o minml
File "minml.ml", line 43, characters 0-9:
Error:Unbound module Llvm

Даже когда я предоставляю ocamlc абсолютные пути к файлам llvm, вот так ...

$ ocamlc -g -dtypes -pp camlp4oof -I +camlp4 dynlink.cma camlp4lib.cma -cc g++ /usr/lib/ocaml/llvm-2.7/llvm.cma /usr/lib/ocaml/llvm-2.7/llvm_bitwriter.cma minml.ml -o minml 

... безрезультатно.

Что я делаю не так?

1 Ответ

17 голосов
/ 03 октября 2010

Ваша команда выполняет две вещи: она компилирует minml.mlminml.cmo), затем связывает полученный объект в minml.

Для компиляции модуля требуется interface из зависимостей.Интерфейсы содержат информацию о типах, которая необходима как для проверки типов, так и для генератора кода;эта информация не повторяется при реализации (.cma здесь).Таким образом, для этапа компиляции, llvm.cmi должно быть доступно.Компилятор ищет его в пути включения, поэтому вам нужен дополнительный -I +llvm-2.7 (что сокращенно от -I /usr/lib/ocaml/llvm-2.7).

Для этапа компоновки требуется llvm.cma, который содержит реализацию модуля с байт-кодом.,Здесь вы можете использовать -I или указать полный путь, чтобы сообщить ocamlc, где найти файл.

ocamlc -g -dtypes -I +camlp4 -I +llvm-2.7 -pp camlp4oof -c minml.ml
ocamlc -g -cc g++ -I +camlp4 -I +llvm-2.7 dynlink.cma camlp4lib.cma llvm.cma llvm_bitwriter.cma  minml.cmo -o minml

или если вы хотите выполнить оба этапа в одной команде:

ocamlc -g -dtypes -cc g++ -I +camlp4 -I +llvm-2.7 dynlink.cma camlp4lib.cma llvm.cma llvm_bitwriter.cma -pp camlp4oof minml.ml -o minml
...