我希望在我的OCaml Std
文件中使用模块.ml
。
我尝试#load "Std"
,但编译器抱怨。
如何在OCaml中加载模块?
答案 0 :(得分:4)
您必须首先编译要包含的模块,根据它将编译文件的位置提供给模块的编译命令,然后在最终编译命令行中提供。
让我们考虑例如文件foo/moduleA.ml
:
let v = 1
和档案bar/moduleB.ml
:
open ModuleA
let w = v
命令:
$ cd foo
$ ocamlc -c moduleA.ml
$ cd ..
将生成moduleA.cmo
和moduleA.cmi
。前者是模块的字节码对象(如本地目标文件中的.o
文件,但包含字节码数据和文本),后者是字节码编译头,由自动生成的.mli
生成文件。这个字节码头是编译器编译依赖ModuleA
。
$ cd bar
$ ocamlc -I ../foo -c moduleB.ml
$ cd ..
将成功生成moduleB.cmo
,这取决于ModuleA
,因为前一个命令已成功,并且因为我们指示编译器在哪里查找具有-I
命令行的依赖项参数,后跟第一个模块的路径。
下面的最后一个命令将生成一个可从两个模块执行的字节码:
$ ocamlc -I foo -I bar moduleA.cmo moduleB.cmo -o prog.byte
必须按顺序提供模块,以便让编译器首先了解依赖性 。这次-I
参数指示了查找.cmo
文件的位置。
在您的情况下,您必须使用-I <location of std.cmi>
进行编译正确阶段,并使用-I <location of std.cmo>
(或std.cma
(如果它是库)进行第二阶段(链接)相)。如果您可以在一个命令中组合两个阶段(即ocamlc -I foo foo/moduleA.ml bar/moduleB.ml -o prog.byte
),并且如果cmo
和cmi
文件都在同一目录中,则只有一个参数就足够了。