5

我在 OCaml FFI 上遵循本教程Ctypes并通过 OPAM 安装:

opam install ctypes

但是,OCaml 没有找到该模块:

open Ctypes
(* ... *)

我收到错误:

Unbound module Ctypes

看起来我需要让 OCaml 知道我的 Ctypes 安装在哪里?我是否需要更新一些路径变量以让 OCaml 查找通过 OPAM 安装的库?

这是 Ubuntu 15.04、OCaml 4.01.0、OPAM 1.2.0。

4

1 回答 1

8

在您的系统上安装某些东西并不会使其对编译器自动可见,这不仅适用于 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它会自动对编译器可见。

于 2015-05-06T01:15:41.120 回答