如何使从OPAM安装的库可用于OCaml?
我在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。
在您的系统上安装某些东西并不会使它对编译器自动可见,这不仅适用于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
发现包的名称,它会被自动地可见编译器。
你用什么构建工具?你能告诉我们你如何编译你的代码? – PatJ