加载OCaml模块不在当前目录中

时间:2017-06-13 17:56:37

标签: ocaml

我正在编写一个大型OCaml项目。我写了一个文件foo.ml,它完美无缺。在foo.ml目录的子目录中,有一个文件bar.ml

bar.ml引用foo.ml中的代码,因此其开头行是:

open Foo

这在编译时给出了一个错误:

Unbound module Foo.

如何在不更改foo.ml的位置的情况下解决此问题?

1 个答案:

答案 0 :(得分:9)

简单的方法是使用OCaml构建系统之一,如ocamlbuild或oasis。另一种选择是jbuilder,但是jbuilder对文件组织很有意识,并且不允许你要求的那种子目录结构。

更明确的路径带有警告:OCaml构建过程很复杂,许多移动部件很难处理。

在这个习惯性警告之后,在寻找模块时,OCaml编译器首先在当前编译环境中查找模块,然后查找已编译的接口" .cmi" " -I"指定的目录中的文件选项标志(加上当前目录和标准库目录)。

因此,为了编译bar.ml文件,您需要使用-I ..选项在包含目录列表中添加父目录。

毕竟,您将发现在链接阶段,所有目标文件(即.cmo或.cmx)都需要以与项目依赖关系图兼容的拓扑顺序列出。

因此,让我重复一下我的建议:使用正确的构建系统。