Как сделать библиотеку, установленную из 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
и он будет автоматически сделан видимым для компилятора.