我遵循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
,并且它会自动地被编译器看到。