我有一个文件Tools.ml,其中包含我自己编写的一些常用实用程序函数.在.../Code/我有几个文件夹,每个文件夹包含一个项目.我的问题是我应该放置这个Tools.ml,以便所有文件夹和文件.../Code/可以共享此模块Open Tools.
希望我的问题很清楚......有没有人有一个好的解决方案?
编辑1:关注 @ gasche的回答,我写tools.ml了如下:
module Tools =
struct
let a_function = ...
...
end
Run Code Online (Sandbox Code Playgroud)
然后我编译了它,并ocamlfind install tools META tools.cmo tools.cmx tools.ml按照建议完成,看起来很顺利.然后我写test.ml了如下:
open Tools
let f = Tools.a_function
Run Code Online (Sandbox Code Playgroud)
然后我编译了它ocamlc test.ml -o test,然后我得到一个错误:
File "test.ml", line 1, characters 0-1:
Error: Error while linking test.cmo:
Reference to undefined global `Tools'
Run Code Online (Sandbox Code Playgroud)
谁能告诉我发生了什么?
gas*_*che 13
您可以将其打包为独立库,将其与其他OCaml库一起安装,并从项目中作为库访问它.
一个非常简单的方法是为其编写META文件ocamlfind.在某个地方创建一个目录,让您轻松拥有"个人图书馆"项目.假设您有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"
Run Code Online (Sandbox Code Playgroud)
一旦你编写了这个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
Run Code Online (Sandbox Code Playgroud)
(当然tools.cmo等等必须存在,就是你必须install在编译包之后.如果你已经使用过ocamlbuild,它们很可能在一个_build子目录中,所以ocamlfind install ... _build/tools.cmo ....)
从您的众多项目中,您可以轻松地使用您的库,或者直接使用ocamlfind toold,如果这是您已经编写的程序
ocamlfind ocamlc -package tools ....
Run Code Online (Sandbox Code Playgroud)
或通过ocamlbuild例如提供的设施添加package(tools)到您的标签.
如果您对库进行了更改并希望从您的项目中访问它,请重新安装库
ocamlfind remove tools
ocamlfind install tools META ...
Run Code Online (Sandbox Code Playgroud)
您还可以处理所有这些oasis,这是ocamlfind/ocamlbuild之上的一个层,以自动执行此过程.我不熟悉oasis这些例子,但对于这样一个受限制的案例(单文件库)应该同样简单,如果你希望以后扩展你的库(例如,它还可以处理文档生成,预编译配置......).