首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OCaml:引用未定义的全局“A”

OCaml:引用未定义的全局“A”
EN

Stack Overflow用户
提问于 2015-03-29 05:09:12
回答 1查看 2.1K关注 0票数 2

我有三个签名-- A.mliB.mliC.mli。在它们中,我分别有子模块AaBbCc,以及实现AiBiCi的签名。

我在一个名为D.ml的文件中实现了它们,该文件如下所示

代码语言:javascript
复制
open A
open B
open C

module Ai : Aa = struct ... end
module Bi : Bb = struct ... end
module Ci : Cc = struct ... end

我使用以下命令依次编译它们:

代码语言:javascript
复制
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,其中我尝试使用模块AiBiCi

代码语言:javascript
复制
open A
open B
open C

module M = Ai(Ci)

(* do something else *)

然而,当我试图编译E.ml时,我得到了

代码语言:javascript
复制
Error: Error while linking E.cmo:
Reference to undefined global `A`

我认为我必须在编译步骤中加入D.ml,但我不知道如何。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-29 17:40:23

直接使用ocamlcocamlopt编译器(即使在ocamlfind的帮助下)并不是一件容易的事情,应该只留给那些编写OCaml工具的人,并且非常肯定他们在做什么。因此,简而言之,只需使用ocamlbuild,这是OCaml世界中编译事物的默认方法。既然您使用的是Core库,那么使用corebuild而不是ocamlbuild也是个好主意。corebuild是随core一起提供的,它实际上是一个围绕ocamlbuild的小包装器,它添加了核心依赖项以及一些方便的标志。因此,使用corebuild,您可以使用以下方法进行编译:

代码语言:javascript
复制
 corebuild E.native

如果没有corebuild,您可以用

代码语言:javascript
复制
 ocamlbuild -pkg core E.native

ocamlbuild将为您完成所有的工作,即查找所有依赖项,按正确的顺序排序,调用适当的工具等。你只需要这个,指挥官。

如果您仍然对如何正确编译示例项目感兴趣,那么您可以询问ocamlbuild。使用-classic-display选项,它将显示所有中间命令,

代码语言:javascript
复制
 ocamlbuild -use-ocamlfind -classic-display -pkg core E.byte

会告诉你所有的步骤。(您可能需要ocamlbuild -clean,以便从一开始就可以看到所有步骤)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29325832

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档