如何使从OPAM提供给OCaml的库安装?

我遵循OCaml FFI上的这个教程 ,并通过OPAM安装了Ctypes:

 opam install ctypes 

但是,OCaml没有find该模块:

 open Ctypes (* ... *) 

我收到错误:

 Unbound module Ctypes 

它看起来像我需要让OCaml知道我的Ctypes安装在哪里? 我是否需要更新一些pathvariables让OCaml查找通过OPAM安装的库?

这是Ubuntu 15.04,OCaml 4.01.0,OPAM 1.2.0。

在你的系统上安装某些东西不会使编译器自动显示,不仅对于OCaml,对于大多数传统的系统,例如C或C ++来说,情况都是如此。

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

在OCaml中,我们有一个相当成熟的基础设施,特别适合于opam 。 我不想深入解释,只是一个快速的概述。

ocamlfind工具用于在您的系统上查找库。 在想法上它有点接近pkg-config ,但是在设计上有很大不同。 它包装编译器工具,以便将选项传递给它们。

ocamlbuild是一个奇特的瑞士刀,这是每OCamler阿森纳必须具备的。 这是一个知道所有其他工具,以及如何将它们粘合在一起的工具。 我会说这是编译你的项目的首选方式,特别是小的。

oasis在精神上接近autotools ,但不是那种通用的,是在前提下写的,应该很容易使用。 事实上,这很容易,但仍然相当灵活和强大。

记住这个概述,我们可以直接去解决你的问题。 所以你已经安装了ctypes。 现在让我们来看看如何在ocamlfind角度看到你的系统中的ctypes包。 最简单的方法是列出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发现的包的ocamlfind ,并且它会自动地被编译器看到。