Как сделать библиотеку, установленную из OPAM, доступной для OCaml?

Я следовал этому руководству на OCaml FFI и установил Ctypes через OPAM:

opam install ctypes

Однако OCaml не находит модуль:

open Ctypes
(* ... *)

Я получаю ошибку:

Unbound module Ctypes

Похоже, мне нужно сообщить OCaml, где находится моя установка Ctypes? Нужно ли мне обновлять переменную пути, чтобы OCaml искал мои библиотеки, установленные через OPAM?

Это Ubuntu 15.04, OCaml 4.01.0, OPAM 1.2.0.

1 ответ

Установка чего-либо в вашей системе не делает его автоматически видимым для компилятора, это верно не только для OCaml, но и для большинства обычных систем, таких как C или C++, если назвать несколько.

Это означает, что вам нужно передать некоторые флаги компилятору, или написать Makefiles, или использовать некоторые системы управления проектами.

В OCaml у нас достаточно развитая инфраструктура, которая очень хорошо работает с opam особенно. Я не хочу углубляться в объяснения, просто краткий обзор.

ocamlfind Инструмент используется для поиска библиотек в вашей системе. Это несколько близко к pkg-config по идее, но совершенно другой по дизайну. Он оборачивает инструменты компилятора, чтобы передавать им параметры.

ocamlbuild это модный швейцарский нож, который должен быть в арсенале каждого OCamler. Это инструмент, который знает все другие инструменты и как их склеивать. Я бы сказал, что это предпочтительный способ компиляции ваших проектов, особенно небольших.

oasis близко к autotools в духе, но не настолько общего и написано в предпосылке, что это должно быть очень легко использовать. И действительно, это очень легко, но все же довольно гибко и мощно.

Имея в виду этот обзор, мы можем перейти непосредственно к вашей проблеме. Итак, вы установили ctypes. Теперь давайте посмотрим, как ctypes пакет виден в вашей системе из ocamlfind перспектива. Самый простой способ - перечислить все пакеты, видимые для ocamlfind и найти ctypes там:

$ ocamlfind list | grep ctypes
ctypes              (version: 0.4.1)
ctypes.foreign      (version: 0.4.1)
ctypes.stubs        (version: 0.4.1)
ctypes.top          (version: 0.4.1)

Итак, похоже, что под зонтиком ctypes находятся 4 библиотеки. Одна базовая библиотека и несколько дополнительных библиотек, которые предоставляют некоторые функции, которые по умолчанию не нужны.

Нет, давайте попробуем использовать их с ocamlbuild

ocamlbuild -package ctypes yourprogram.native

Или без ocamlbuild непосредственно с ocamlfind:

ocamlfind ocamlopt -package ctypes yourprogram.ml -o yourprogram.native

Как вы можете видеть, есть package опция, в которую вы можете передать имя пакета, найденное ocamlfindи он будет автоматически сделан видимым для компилятора.

Другие вопросы по тегам