Ocaml代码编译,但不与顶级

时间:2011-06-28 19:10:06

标签: load ocaml undefined-reference ocaml-toplevel

我正在做一个免费课程。下面的ocaml代码在我“make”时编译,但是一旦我试图把它放到顶层就会抱怨。为什么呢?

let main () =
  (* Parsing arguments *)
  let f_name = ref "" in
  Arg.parse [ ] (fun s -> f_name := s) "Mini-Java analyzer";
  (* Parsing of the source file *)
  let simple_java_prog =
    if String.compare !f_name "" = 0 then failwith "no program file given";
    Localizing.current_file_name := !f_name;
    let f_desc = open_in !f_name in
    let lexbuf = Lexing.from_channel f_desc in
    let java_prog =
      try Java_parser.program Java_lexer.token lexbuf
      with
      | e ->
          Printf.printf "Exception during parsing: %s\n"
        (Printexc.to_string e);
          failwith "Stopped" in
    Simple_java_translate.tr_java_prog java_prog in
  Printf.printf "finished...\n"

 let _ = main ()

但是当我“c-c c-e”(来自emacs)这段代码到顶层时,它给了我错误

....    
  let main () =

Error: Reference to undefined global `Localizing'

然后,有了这个错误信息,我从

得到了解释

http://caml.inria.fr/pub/docs/manual-ocaml/manual023.html

说,

  

对未定义的全局模式的引用       您忽略了在内存中加载模块的实现   #load。

因此,我正在尝试:#load“localizing.cmo”。但是,现在的问题是:没有localizing.cmo 这是搜索结果。

bash-3.2$ ls localizing*
localizing.cmi  localizing.cmx  localizing.ml   localizing.mli  localizing.o

我hesite把makefile放到这里,问题的根源不应该来自“Makefile”,除了它太大了。此外,我不应该修改makefile,因为这是由课程的网站提供的。

有什么问题?谢谢。我是否正确地得出结论:并非所有的ocaml程序都应该能够在顶层执行?

1 个答案:

答案 0 :(得分:5)

问题出在makefile中,或至少部分是解决方案。

  • .cmi个文件是编译接口(从.mli编译而来)。
  • .cmo文件是字节码编译的实现(使用.mlocamlc编译而来。)
  • .cmx.o文件是本机代码编译的实现(使用.mlocamlopt编译而来。)

您已将程序编译为本机代码。但是toplevel运行字节码。您需要将模块编译为字节码,方法是在makefile中添加以下内容:

default: localizing.cmo localizing.cmx
%.cmo: %.ml
        ocamlc -c $<