functional-programming - ocaml编译过程的逻辑

标签 functional-programming ocaml

我在 OCaml 中编写了一个小项目。

我有两个文件夹:

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

./渗透。里面有两个文件:myPercolation.mlpercolation_stats.ml


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

myPercolation.ml 也可以作为模块使用,但它使用 myUnionFind.ml 中定义的 MyUnionFind 模块。

percolation_stats.ml 使用 myPercolation.ml

除此之外,我还使用电池


我想将它们全部编译以工作并获得可执行文件run

但是怎么办?

我尝试过以下方法:

在文件夹./percolation内,我做了ocamlfind ocamlc -package Battery -linkpkg ../myUnionFind/myUnionFind.ml myPercolation.ml percolation_stats.ml -o run

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


另外,如果我只想编译 ./myUnionFind/myUnionFind.ml 一次,我怎样才能不每次都再次编译 myUnionFind.ml又来了?

最佳答案

myUnionFind内,您应该将myUnionfind.ml编译为编译单元:

cd myUnionFind
ocamlc -c myUnionFind.ml

这将生成 myUnionFind.cmo(存储编译后的实现)和 myUnionFind.cmi(存储编译后的接口(interface))。使用 MyUnionFind 的其他模块将需要在类型检查类型中访问 cmi

在 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 Battery 包装每个命令,但仅使用 linkpkg 包装链接命令)。

为了使这个过程更简单:

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

  • 但是如果您想使用 myUnionFind 作为外部库,最好的办法是使用 findlib 安装它,以便于从渗透中查找并指定;有关如何创建 findlib 包的信息(非常简单),请参阅 this older answer

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

关于functional-programming - ocaml编译过程的逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14960697/

相关文章:

scala - 以无状态方式处理输入事件

algorithm - 线程二叉树结构在 Haskell 中有什么优势吗?

haskell - 在 Haskell 中对自定义列表使用反向

haskell - 应用程序组成,单子(monad)不组成

compilation - OCaml 编译速度和仿函数

ocaml - OCaml 中函数组合的尾递归版本

c# - 在 C# 中是否有此迭代算法的性能更好的函数版本?

types - 使用原因显示类型和值

f# - 在函数式编程中定义无点样式的函数。优点/缺点是什么?

ocaml - 在ocaml中运行可执行(windows)文件