ocamlc,模块编译

时间:2009-12-04 01:42:25

标签: ocaml

我在ocaml写了一个应用程序。它由几个模块组成:

  • Util(util.ml)
  • Work1(work1.ml) - 打开Util
  • Work2(work2.ml) - 打开Util,
  • Main(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

谢谢!

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

如果你有以下模块:

module Util
    ...
end;;

module Work2
     open Util
     ...
end;;

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

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

然后顺序必须是当每个模块调用open时它找到已打开的模块已经编译的方式,在示例abover中顺序将是

Util - > Work2 - > Work1 - >主

请注意,OCaml不支持模块的循环冗余,意味着你不能拥有

module Work1
       open Work2;;
end;;

module Work2
       open Work1;;
end;;

如果您的应用程序有很多模块,您可以使用 Ocamldep http://caml.inria.fr/pub/docs/manual-ocaml/manual027.html,它会为您找出图形相关性。

答案 2 :(得分:0)

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

使用以下内容创建_tags文件:

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

构建
ocamlbuild -use-ocamlfind main.byte