2

我写了一个小项目OCaml

我有两个文件夹:

./myUnionFind. 里面有一个文件myUnionFind.ml

./percolation. 里面有两个文件:myPercolation.mlpercolation_stats.ml.


myUnionFind.ml作为一个模块工作。

myPercolation.ml也可以作为模块工作,但它MyUnionFind使用myUnionFind.ml.

percolation_stats.ml使用myPercolation.ml.

最重要的是,我还使用Batteries.


我想将它们全部编译并获得一个可执行文件run

但是怎么做?

我尝试了以下方法:

里面的文件夹./percolation,我做了ocamlfind ocamlc -package batteries -linkpkg ../myUnionFind/myUnionFind.ml myPercolation.ml percolation_stats.ml -o run

它失败了,并说File "myPercolation.ml", line 1, characters 0-16: Error: Unbound module MyUnionFind,但我确实包含了那个文件夹../myUnionFind,对吧?


另外,如果我只想编译./myUnionFind/myUnionFind.ml一次,我怎么能这样做,而不是每次都一次myUnionFind.ml又一次地编译?

4

1 回答 1

2

在里面myUnionFind,你应该编译myUnionfind.ml成一个编译单元:

cd myUnionFind
ocamlc -c myUnionFind.ml

这将生成myUnionFind.cmo,它存储已编译的实现,以及myUnionFind.cmi,它存储已编译的接口。使用的其他模块MyUnionFind将需要访问cmiat 类型检查类型。

在 percolation 中,您可以通过执行将 myPercolation.ml 编译为模块

cd 渗透 ocamlc -I ../myUnionFind -c myPercolation.ml

同样,您会同时获得 .cmo 和 .cmi。请注意,编译器已经在搜索路径中自动查找了 myUnionFind.cmi,并且由于该-I选项而找到了它。

然后您可以编译percolation_stats(依赖于之前的两个编译单元)

ocamlc -I ../myUnionFind -c percolation_stats.ml

您最终将生成的三个 .cmo 链接在一起以构建可执行文件:

ocamlc ../myUnionFind.cmo myPercolation.cmo percolation_stats.cmo -o run

(如果您使用电池,请用 包装每个命令ocamlfind ocamlc -package batteries,但只用 包装链接命令linkpkg)。

为了使这个过程更简单:

  • ocamlbuild擅长查找和编译当前项目的所有文件以生成可执行文件。在percolation目录中,ocamlbuild percolation_stats.byte可以生成包含所有内容的可执行文件

  • 但是如果你想myUnionFind用作外部库,最好的办法是安装它findlib,以便于从 中查找和指定percolation;有关如何创建 findlib 包的信息(非常简单),请参阅这个较旧的答案

  • 一旦 myUnionFind 是一个 findlib 包,单个命令ocamlbuild -use-ocamlfind -pkgs batteries,my-union-find percolation_stats.byte(或.native)应该足以获得可执行文件

于 2013-02-19T15:55:21.297 回答