2015-05-06 3 views
3

Я последовал this tutorial на OCaml FFI и установил Ctypes через OPAM:Как сделать библиотеку, установленную из OPAM доступной для OCaml?

opam install ctypes 

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

open Ctypes 
(* ... *) 

я получаю сообщение об ошибке:

Unbound module Ctypes 

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

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

+0

Какой инструмент построения вы используете? Не могли бы вы показать нам, как вы компилируете свой код? – PatJ

ответ

6

Установка чего-либо в вашей системе не делает его автоматически видимым для компилятора, это верно не только для 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, и оно будет автоматически отображено компилятором.