ocaml编译过程的逻辑

时间:2013-02-19 15:06:48

标签: functional-programming ocaml

我在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一次又一次地编译?

1 个答案:

答案 0 :(得分:2)

myUnionFind内,您应该将myUnionfind.ml编译为已编译的单位:

cd myUnionFind
ocamlc -c myUnionFind.ml

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

在渗透中,您可以通过执行

将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查找和指定1}};有关如何创建findlib包的信息(非常简单),请参阅this older answer

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