我有一个文件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'
有人能告诉我发生了什么吗?
答案 0 :(得分:13)
您可以将其打包为独立库,将其与其他OCaml库一起安装,并从项目中以库的形式访问它。
一种非常简单的方法是为ocamlfind
编写META文件。在某个地方创建一个目录,让您轻松拥有“个人图书馆”项目。假设您有tools.ml
和tools.mli
,并且您的代码依赖于某个findlib包(例如unix
和bigarray
)。你的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.o
和tools.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
不太熟悉,无法提供这样的例子,但对于这样一个受限制的案例(单文件库)应该同样简单,如果你希望以后扩展,那么扩展性会更好您的库(例如,它还可以处理文档生成,预编译配置......)。