Подтвердить что ты не робот

Unbound модули в 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 

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

Что я делаю неправильно?

4b9b3361

Ответ 1

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

Для компиляции модуля требуются интерфейсы зависимостей. Интерфейсы содержат информацию о наборе текста, которая необходима как для проверки типов, так и для генератора кода; эта информация не повторяется в реализации (.cma здесь). Поэтому для этапа компиляции llvm.cmi должен быть доступен. Компилятор ищет его в include-пути, поэтому вам нужен дополнительный -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