1
我在写一个大的OCaml项目。我写了一个文件foo.ml
,它完美的工作。在foo.ml
的子目录中,有一个文件bar.ml
。在foo.ml
加载不在当前目录中的OCaml模块
bar.ml
引用代码,因此它的开场白是:
open Foo
这让我在编译时错误:
Unbound module Foo.
我能做些什么来解决这个不改变位置foo.ml
?
我在写一个大的OCaml项目。我写了一个文件foo.ml
,它完美的工作。在foo.ml
的子目录中,有一个文件bar.ml
。在foo.ml
加载不在当前目录中的OCaml模块
bar.ml
引用代码,因此它的开场白是:
open Foo
这让我在编译时错误:
Unbound module Foo.
我能做些什么来解决这个不改变位置foo.ml
?
简单的道路是使用ocamlbuild或oasis等OCaml构建系统之一。另一种选择是jbuilder,但jbuilder对文件组织非常有见识,并且不允许你要求的那种子目录结构。
更明确的路径带有警告:OCaml构建过程很复杂,很多移动部件很难处理。
在寻找模块后,OCaml编译器首先在当前编译环境中查找模块,然后在“-I”选项标志指定的目录中查找编译接口“.cmi”文件(加上当前目录和标准库目录)。
因此,为了编译您的bar.ml
文件,您需要使用-I ..
选项在包含的目录列表中添加父目录。
毕竟,你会发现在链接阶段,所有的目标文件(即.cmo或.cmx)需要按照与你的项目的依赖关系图兼容的拓扑顺序列出。
因此,让我重复我的建议:使用适当的构建系统。
如何编译/加载'bar.ml'文件? – Bergi
https://caml.inria.fr/pub/docs/manual-ocaml/comp.html#sec269 – Bergi