2015-05-06 65 views
3

我在OCaml的FFI其次this tutorial并通过OPAM安装Ctypes如何使从OPAM安装的库可用于OCaml?

opam install ctypes 

然而,OCaml中没有找到该模块:

open Ctypes 
(* ... *) 

我收到的错误:

Unbound module Ctypes 

它看起来像我需要让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。现在让我们来看看包在ocamlfind的角度如何在您的系统中可见。最简单的方法是列出所有的包,可见ocamlfind找到​​有:

$ 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 

或者直接用ocamlfind使用它们,而不ocamlbuild

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

正如你可以看到,有一个package选项,您可以向其中通由ocamlfind发现包的名称,它会被自动地可见编译器。