2017-06-13 49 views
1

我在写一个大的OCaml项目。我写了一个文件foo.ml,它完美的工作。在foo.ml的子目录中,有一个文件bar.ml。在foo.ml加载不在当前目录中的OCaml模块

bar.ml引用代码,因此它的开场白是:

open Foo 

这让我在编译时错误:

Unbound module Foo. 

我能做些什么来解决这个不改变位置foo.ml

+1

如何编译/加载'bar.ml'文件? – Bergi

+0

https://caml.inria.fr/pub/docs/manual-ocaml/comp.html#sec269 – Bergi

回答

6

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

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

在寻找模块后,OCaml编译器首先在当前编译环境中查找模块,然后在“-I”选项标志指定的目录中查找编译接口“.cmi”文件(加上当前目录和标准库目录)。

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

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

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