3

フリーコースの練習をしています。次の 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 ()

しかし、このコードを(emacsから)トップレベルに「cc ce」すると、エラーが発生します

....    
  let main () =

Error: Reference to undefined global `Localizing'

次に、このエラー情報で、私は説明を得ました

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

つまり、

未定義のグローバル mod への参照 #load を使用してモジュールの実装をメモリにロードすることを怠っています。

したがって、私はやろうとしています: #load "localizing.cmo". しかし、問題は、localizing.cmo がないことです。これが検索結果です。

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

ここに makefile を入れるのをためらっていますが、問題の原因は「Makefile」にあるべきではありません。また、コースのサイトで提供されているため、makefile を変更することは想定されていません。

どうしたの??ありがとうございました。すべての ocaml プログラムがトップレベルで実行できるとは限らないという結論を下すのは正しいでしょうか?

4

1 に答える 1

5

問題はメイクファイルにあるか、少なくとも解決策の一部です。

  • .cmiファイルはコンパイルされたインターフェイスです (からコンパイルされます.mli)。
  • .cmoファイルはバイトコードでコンパイルされた実装です (でコンパイルされます.ml) ocamlc
  • .cmxファイルはネイティブ コードで.oコンパイルされた実装です (でコンパイルされます.ml) ocamlopt

プログラムをネイティブ コードにコンパイルしました。しかし、トップレベルはバイトコードを実行します。次のようなコードを makefile に追加して、モジュールをバイトコードにコンパイルする必要があります。

default: localizing.cmo localizing.cmx
%.cmo: %.ml
        ocamlc -c $<
于 2011-06-28T23:32:55.410 に答える