2011-06-28 5 views
3

私は無料コースのエクササイズをしています。次のocamlコードは "make"するとコンパイルされますが、一度それをトップレベルに入れようとすると文句を言います。どうして?トップレベルでコンパイルされていないOcamlコード

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

未定義グローバル・モデムへの参照 モジュールの実装を#loadで にロードするのを怠りました。

こうすると、#load "localizing.cmo"を実行しようとしています。しかし、今問題は次のとおりです。ローカライズはありません.cmo ここに検索結果があります。

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

メイクファイルをここに置くと、問題の原因は「メイクファイル」から来てはならず、大きなものです。また、私はコースのサイトで提供されているので、makefileを変更するはずがありません。

何が問題ですか?ありがとうございました。すべてのocamlプログラムがトップレベルで実行できるはずではないと結論付けるのは間違いありませんか?

+0

'cmo'または' cma'を読み込むことができます。どちらも 'ocamlc [.opt]'で作成できます。 – nlucaroni

+0

私は、ほとんどの問題の原因が 'Makefile'であることがわかりました。 – nlucaroni

答えて

5

問題はmakefileにあるか、少なくとも解決策は一部です。

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

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

default: localizing.cmo localizing.cmx 
%.cmo: %.ml 
     ocamlc -c $< 
関連する問題