Functional programming ocaml编译过程的逻辑

Functional programming ocaml编译过程的逻辑,functional-programming,ocaml,Functional Programming,Ocaml,我在OCaml中写了一个小项目 我有两个文件夹: /myUnionFind。里面有一个文件myUnionFind.ml /percolation。里面有两个文件:myPercolation.ml和percolation\u stats.ml myUnionFind.ml作为一个模块工作 myPercolation.ml也可用作一个模块,但它使用MyUnionFind中定义的MyUnionFind.ml模块 percolation\u stats.ml使用myPercolation.ml 除此之

我在
OCaml
中写了一个小项目

我有两个文件夹:

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

/percolation
。里面有两个文件:
myPercolation.ml
percolation\u stats.ml


myUnionFind.ml
作为一个模块工作

myPercolation.ml
也可用作一个模块,但它使用
MyUnionFind
中定义的
MyUnionFind.ml
模块

percolation\u stats.ml
使用
myPercolation.ml

除此之外,我还使用
电池


我想把它们全部编译好,然后得到一个可执行文件
run

但是怎么做呢?

我尝试了以下方法:

在文件夹
/percolation
中,我执行了
ocamlfind ocamlc-package-batteries-linkpkg../myUnionFind/myUnionFind.ml myPercolation.ml percolation_stats.ml-o运行

它失败了,并说
文件“myPercolation.ml”,第1行,字符0-16:
错误:未绑定模块MyUnionFind
,但我确实包含了该文件夹
。/MyUnionFind
,对吗



另外,如果我只想编译一次
/myUnionFind/myUnionFind.ml
,我怎么能做到不是每次都会反复编译
myUnionFind.ml

myUnionFind
中,您应该将
myUnionFind.ml
编译成一个编译单元:

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

在percolation内部,您可以通过执行以下操作将myPercolation.ml编译为一个模块

镉渗滤 ocamlc-I../myUnionFind-c myPercolation.ml

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

然后可以编译
percolation\u stats
(依赖于前面的两个编译单元)

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

ocamlc ../myUnionFind.cmo myPercolation.cmo percolation_stats.cmo -o run
(如果使用电池,请使用
ocamlfind ocamlc-package batters
包装每个命令,但仅使用
linkpkg
包装链接命令)

要简化此过程,请执行以下操作:

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

  • 但是,如果您想使用
    myUnionFind
    作为外部库,最好的做法是使用
    findlib
    安装它,以便从
    percolation
    轻松查找和指定;有关如何创建findlib包的信息(非常简单),请参阅

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


您能在某处提供您的代码吗?最好是吉特回购。这将使我们更容易排除故障。您所说的
是什么意思,而仅是带有linkpkg的linking命令
?您不需要在生成最终可执行文件的链接步骤之前(生成编译单元时)将
-linkpkg
告诉ocamlfind。确定。如果我想将三个文件编译在一起,因为它们都已更改,该怎么办?不是一个接一个地编译,而是编写脚本或使用构建工具?有些步骤可以跳过,但我现在记不清是哪一步了。尝试使用all
.ml
发出的命令,添加缺少的
-I
选项。请注意,如果更改了
myUnionFind
但没有更改其接口(也没有更改其
.cmi
),则不需要重新编译
myPercolation
;您可以将新的
myUnionFind.cmo
与旧的
.cmo
链接到最终的可执行文件中。单独编译以获得胜利。
ocamlc ../myUnionFind.cmo myPercolation.cmo percolation_stats.cmo -o run