如何从OPAM安装库到OCaml?

时间:2015-05-06 00:29:13

标签: linux ocaml ffi opam

我在OCaml FFI上关注了this tutorial并通过OPAM安装了Ctypes

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 个答案:

答案 0 :(得分:7)

在你的系统上安装一些东西并不会使编译器自动显示,这不仅适用于OCaml,而且适用于大多数传统系统,例如C或C ++。

这意味着您需要将一些标志传递给编译器,或者编写Makefile,或者使用一些项目管理系统。

在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找到的包名称传递给它,并且它将自动对编译器可见。