我在OCaml
写了一个小项目。
我有两个文件夹:
./myUnionFind
。里面有一个文件myUnionFind.ml
。
./percolation
。里面有两个文件:myPercolation.ml
和percolation_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
一次又一次地编译?
答案 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
)应足以获得可执行文件