Несвязанные модули в OCaml
Моя проблема в том, что ocamlc и ocamlopt отказываются от поиска сторонних библиотек, установленных через 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 ответ
Ваша команда делает две вещи: она компилирует minml.ml
(в minml.cmo
), а затем связать полученный объект в minml
,
Компиляция модуля требует интерфейсов зависимостей. Интерфейсы содержат информацию о типах, которая необходима как для проверки типов, так и для генератора кода; эта информация не повторяется при реализации (.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