我有三个签名-- A.mli、B.mli和C.mli。在它们中,我分别有子模块Aa、Bb和Cc,以及实现Ai、Bi和Ci的签名。
我在一个名为D.ml的文件中实现了它们,该文件如下所示
open A
open B
open C
module Ai : Aa = struct ... end
module Bi : Bb = struct ... end
module Ci : Cc = struct ... end我使用以下命令依次编译它们:
ocamlfind ocamlc -linkpkg -thread -package core A.mli
ocamlfind ocamlc -linkpkg -thread -package core B.mli
ocamlfind ocamlc -linkpkg -thread -package core C.mli
ocamlfind ocamlc -linkpkg -thread -package core D.ml一切都成功了。
然后,我有一个文件E.ml,其中我尝试使用模块Ai,Bi,Ci。
open A
open B
open C
module M = Ai(Ci)
(* do something else *)然而,当我试图编译E.ml时,我得到了
Error: Error while linking E.cmo:
Reference to undefined global `A`我认为我必须在编译步骤中加入D.ml,但我不知道如何。
发布于 2015-03-29 17:40:23
直接使用ocamlc或ocamlopt编译器(即使在ocamlfind的帮助下)并不是一件容易的事情,应该只留给那些编写OCaml工具的人,并且非常肯定他们在做什么。因此,简而言之,只需使用ocamlbuild,这是OCaml世界中编译事物的默认方法。既然您使用的是Core库,那么使用corebuild而不是ocamlbuild也是个好主意。corebuild是随core一起提供的,它实际上是一个围绕ocamlbuild的小包装器,它添加了核心依赖项以及一些方便的标志。因此,使用corebuild,您可以使用以下方法进行编译:
corebuild E.native如果没有corebuild,您可以用
ocamlbuild -pkg core E.nativeocamlbuild将为您完成所有的工作,即查找所有依赖项,按正确的顺序排序,调用适当的工具等。你只需要这个,指挥官。
如果您仍然对如何正确编译示例项目感兴趣,那么您可以询问ocamlbuild。使用-classic-display选项,它将显示所有中间命令,
ocamlbuild -use-ocamlfind -classic-display -pkg core E.byte会告诉你所有的步骤。(您可能需要ocamlbuild -clean,以便从一开始就可以看到所有步骤)。
https://stackoverflow.com/questions/29325832
复制相似问题