我在ocaml写了一个应用程序。它由几个模块组成:
当我使用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
谢谢!
答案 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