Load Ocaml代码,可编译,但不支持顶级

Load Ocaml代码,可编译,但不支持顶级,load,ocaml,undefined-reference,ocaml-toplevel,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 =

我正在做一个免费课程的练习。下面的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-e”(来自emacs)放到顶层时,它给出了一个错误

....    
  let main () =

Error: Reference to undefined global `Localizing'
然后,有了这个错误信息,我从

也就是说

参考未定义的全局模式 您忽略了在内存中加载模块的实现 带着#负载

因此,我试图做到:#加载“localization.cmo”。但是,现在的问题是:没有本地化.cmo 这是搜索结果

bash-3.2$ ls localizing*
localizing.cmi  localizing.cmx  localizing.ml   localizing.mli  localizing.o
我不想把makefile放在这里,问题的根源不应该来自“makefile”,而且它太大了。此外,我不应该修改makefile,因为它是由课程网站提供的


有什么问题吗??非常感谢。不是所有的ocaml程序都应该能够在顶级执行,这一结论对吗

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

  • .cmi
    文件是编译接口(从
    .mli
    编译)
  • .cmo
    文件是字节码编译的实现(使用
    ocamlc
    .ml
    编译)
  • .cmx
    .o
    文件是本机代码编译实现(使用
    ocamlopt
    .ml
    编译)
您已将程序编译为本机代码。但是顶层运行字节码。您需要将模块编译为字节码,方法是在makefile中添加如下内容:

default: localizing.cmo localizing.cmx
%.cmo: %.ml
        ocamlc -c $<
默认值:localizeing.cmo localizeing.cmx
%.cmo:%.ml
ocamlc-c$<

您可以加载
cmo
cma
。两者都可以通过
ocamlc[.opt]
创建。我发现大多数问题的根源来自
Makefile
——主要是酗酒。