在OCaml中放置共享实用程序模块的位置?

时间:2011-12-29 04:01:41

标签: module ocaml

我有一个文件Tools.ml,其中包含我自己编写的一些常用实用程序函数。在.../Code/下我有几个文件夹,每个文件夹都包含一个项目。我的问题是我应该将Tools.ml放在哪里,.../Code/下的所有文件夹和文件都可以Open Tools共享此模块。

希望我的问题很清楚......有没有人有一个好的解决方案?

编辑1:根据@ gasche的回答,我写了tools.ml如下:

module Tools =
  struct
    let a_function = ...
    ...
  end

然后我编译了它,按照建议做了ocamlfind install tools META tools.cmo tools.cmx tools.ml,看起来很顺利。然后我写了test.ml如下:

open Tools

let f = Tools.a_function

然后我用ocamlc test.ml -o test编译它,然后我收到一个错误:

File "test.ml", line 1, characters 0-1:
Error: Error while linking test.cmo:
Reference to undefined global `Tools'

有人能告诉我发生了什么吗?

1 个答案:

答案 0 :(得分:13)

您可以将其打包为独立库,将其与其他OCaml库一起安装,并从项目中以库的形式访问它。

一种非常简单的方法是为ocamlfind编写META文件。在某个地方创建一个目录,让您轻松拥有“个人图书馆”项目。假设您有tools.mltools.mli,并且您的代码依赖于某个findlib包(例如unixbigarray)。你的META看起来像这样:

name="tools"
description="personal collection of utilities"
version="0.1"
requires="unix,bigarray"
archive(byte)="tools.cmo"
archive(native)="tools.cmx"

一旦你编写了这个META文件,很容易要求ocamlfind“安装”库(如果你愿意,可以删除它),并在你的其他项目中使用它。要进行安装,语法为ocamlfind install <name> <meta-file> <file1> <file2> ...,其中<file1>, <file2>..是您希望在安装目录中看到的文件。您必须至少拥有tools.cmi tools.cmo(以及tools.otools.cmx进行本机编译),但最好还是以tools.mli为例(和,如果您想提供代码tools.ml)。

ocamlfind install tools META tools.cmi tools.cmo tools.o tools.cmx tools.mli

(当然tools.cmo等必须存在,即您在编译包后必须install。如果您使用过ocamlbuild,他们可能会在_build子目录,ocamlfind install ... _build/tools.cmo ...。)

从众多项目中,您可以轻松使用您的图书馆,如果您已经在编译程序时使用ocamlfind toold

ocamlfind ocamlc -package tools ....

或通过ocamlbuild提供的工具,例如,在您的代码中添加package(tools)

如果对库进行了更改并希望可以从项目中访问它,则重新安装库

ocamlfind remove tools
ocamlfind install tools META ...

你也可以通过oasis来处理所有这些,这是ocamlfind / ocamlbuild之上的一个层来自动化这个过程。我对oasis不太熟悉,无法提供这样的例子,但对于这样一个受限制的案例(单文件库)应该同样简单,如果你希望以后扩展,那么扩展性会更好您的库(例如,它还可以处理文档生成,预编译配置......)。