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
轻松查找和指定;有关如何创建findlib包的信息(非常简单),请参阅percolation
- 一旦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