2011-12-29 36 views
12

我有一个文件Tools.ml,其中包含我自己编写的一些常用实用函数。在.../Code/下我有几个文件夹,每个文件夹都包含一个项目。我的问题是我应该在什么地方放置这个Tools.ml,以便.../Code/下的所有文件夹和文件可以通过Open Tools共享此模块。在OCaml中放置共享公用程序模块的位置?

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

EDIT1:继@ 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 

然后我​​编译它,然后我得到了一个错误:

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

谁能告诉我发生了什么?

回答

13

你可以打包为一个独立的库,与其他OCaml的库安装它,对它的访问,从您的项目,作为一个库。

一个非常简单的方式做,这是写一个META文件ocamlfind。创建一个目录,让你可​​以轻松掌握“个人图书馆”项目。假设你有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.cmitools.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这样的例子,但我认为这样的例子应该同样简单(一个文件库),如果你希望以后扩展你的库(例如它也可以处理文档生成,预编译配置...)。

+0

感谢您的评论......您可以看看我在OP中的测试吗? – SoftTimur 2012-01-02 05:39:27

+1

@SoftTimur:在你的情况下,正确的编译命令是'ocamlfind ocamlc -package tools -linkpkg test.ml -o test'。 '-package工具'选项添加软件包,'-linkpkg'选项链接它以生成可执行文件(在生成可执行文件时需要,而不是在编译为'.cmo'时需要)。你也可以使用'ocamlbuild -tag'包(工具)“test.byte”(未测试)。 – gasche 2012-01-02 06:48:14

+0

@gashe:'ocamlfind ocamlc -package tools -linkpkg test.ml -o test'只有在'test.ml'与可执行文件'tool'位于同一个文件夹中时才起作用...你知道为什么吗? – SoftTimur 2012-01-02 08:34:08

相关问题