我在 OCaml
中编写了一个小项目。
我有两个文件夹:
./myUnionFind
。里面有一个文件myUnionFind.ml
。
./渗透
。里面有两个文件:myPercolation.ml
和percolation_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/