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

Ben*_*per 3 ocaml

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

bar.ml引用代码foo.ml,所以它的开头是:

open Foo
Run Code Online (Sandbox Code Playgroud)

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

Unbound module Foo.
Run Code Online (Sandbox Code Playgroud)

如何在不改变位置的情况下解决这个问题foo.ml

oct*_*ron 9

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

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

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

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

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

因此,让我重复一下我的建议:使用适当的构建系统.