我正在编写一个大型OCaml项目。我写了一个文件foo.ml
,它完美无缺。在foo.ml
目录的子目录中,有一个文件bar.ml
。
bar.ml
引用foo.ml
中的代码,因此其开头行是:
open Foo
这在编译时给出了一个错误:
Unbound module Foo.
如何在不更改foo.ml
的位置的情况下解决此问题?
答案 0 :(得分:9)
简单的方法是使用OCaml构建系统之一,如ocamlbuild或oasis。另一种选择是jbuilder,但是jbuilder对文件组织很有意识,并且不允许你要求的那种子目录结构。
更明确的路径带有警告:OCaml构建过程很复杂,许多移动部件很难处理。
在这个习惯性警告之后,在寻找模块时,OCaml编译器首先在当前编译环境中查找模块,然后查找已编译的接口" .cmi" " -I"指定的目录中的文件选项标志(加上当前目录和标准库目录)。
因此,为了编译bar.ml
文件,您需要使用-I ..
选项在包含目录列表中添加父目录。
毕竟,您将发现在链接阶段,所有目标文件(即.cmo或.cmx)都需要以与项目依赖关系图兼容的拓扑顺序列出。
因此,让我重复一下我的建议:使用正确的构建系统。