2009-12-04 110 views
2

我在ocaml中编写了一个应用程序。它由几个模块:ocamlc,模块编译

  • 的Util(util.ml)
  • 工作1(work1.ml) - 开放的Util
  • WORK2(work2.ml) - 开放的Util,太
  • 主(main.ml) - 打开所有的。

当我编译它,使用ocamlc,模块Work2编译失败,并且我得到有关来自Util的未绑定值的错误消息。 单独的编译也不起作用。 我做错了什么?

ocamlc -o app.out -vmthread -pp camlp4o.opt unix.cma threads.cma camlp4of.cma util.ml work1.ml work2.ml main.ml

谢谢!

+1

打造你应该张贴的错误。 – LB40 2009-12-04 15:02:17

回答

2

命令行上的文件顺序在OCaml中很重要。您必须按照相关性顺序放置这些文件。这可能是你遇到的问题。尝试改变,直到它的工作文件的顺序...

0

如果你有这些模块如下所示:

module Util 
    ... 
end;; 

module Work2 
    open Util 
    ... 
end;; 

module Main 
    open Util;; 
    open Work2;; 
    ... 
end;; 

Module Work1 
    open Work2;; 
    ... 
end;; 

那么该命令必须在方式,当每个模块调用打开它找到打开模块已经编译器,在本例中abover的顺序将是

的Util - > WORK2 - >工作1 - >主

注意ocaml的不支持模块循环redundency,意味着你不能有

module Work1 
     open Work2;; 
end;; 

module Work2 
     open Work1;; 
end;; 

如果您的应用程序是一个有很多模块的复杂一点,你可以使用Ocamldephttp://caml.inria.fr/pub/docs/manual-ocaml/manual027.html,它会找出图形依赖你。

0

使用ocamlbuild,它通过魔法计算出依赖关系,构建在单独的目录中,可以轻松地与ocamlfind集成(从3.12开始),并且通常很棒。

创建_tags文件有:

true: thread, package(unix) 
<*.ml>: camlp4o 

而且随着

ocamlbuild -use-ocamlfind main.byte