1

ソフトウェアの更新を間違えたため、OUnit テストを実行できません。

問題を単純な REPL セッションに要約することができたと思います。

$ ocaml -I /opt/local/lib/ocaml/site-lib/oUnit
        OCaml version 4.01.0

# Ounit.assert_equal;;
Error: Wrong file naming: /opt/local/lib/ocaml/site-lib/oUnit/ounit.cmi
contains the compiled interface for
Ounit when OUnit was expected
# OUnit.assert_equal;;
Error: Reference to undefined global `OUnit'

私が間違っていることはありますか?

デフォルトの大文字と小文字を区別しない/大文字と小文字を保持するファイルシステムを備えたMacラップトップでこれを実行していますが、インクルードパスの大文字と小文字を区別しても役に立ちません。


私のより大きな問題は次のように現れます。

ocamlbuild \
  -libs \
  nums,str,unix,oUnit,graph \
  -cflags \
  -g,-w,+a-4,-warn-error,+a-4,-I,/opt/local/lib/ocaml/site-lib/oUnit,-I,/opt/local/lib/ocaml/site-lib/ocamlgraph \
  -lflags \
  -g,-I,/opt/local/lib/ocaml/site-lib/oUnit,-I,/opt/local/lib/ocaml/site-lib/ocamlgraph \
  ./AllTests.native

Error: No implementations provided for the following modules:
     OUnitCore referenced from /opt/local/lib/ocaml/site-lib/oUnit/oUnit.cmxa(OUnit2),
       /opt/local/lib/ocaml/site-lib/oUnit/oUnit.cmxa(OUnit)
     OUnitLoggerStd referenced from /opt/local/lib/ocaml/site-lib/oUnit/oUnit.cmxa(OUnit)
     OUnitUtils referenced from /opt/local/lib/ocaml/site-lib/oUnit/oUnit.cmxa(OUnit2),
       /opt/local/lib/ocaml/site-lib/oUnit/oUnit.cmxa(OUnit)
     OUnitConf referenced from /opt/local/lib/ocaml/site-lib/oUnit/oUnit.cmxa(OUnit2),
       /opt/local/lib/ocaml/site-lib/oUnit/oUnit.cmxa(OUnit)
     OUnitAssert referenced from /opt/local/lib/ocaml/site-lib/oUnit/oUnit.cmxa(OUnit2),
       /opt/local/lib/ocaml/site-lib/oUnit/oUnit.cmxa(OUnit)
     OUnitBracket referenced from /opt/local/lib/ocaml/site-lib/oUnit/oUnit.cmxa(OUnit2),
       /opt/local/lib/ocaml/site-lib/oUnit/oUnit.cmxa(OUnit)
     OUnitTest referenced from /opt/local/lib/ocaml/site-lib/oUnit/oUnit.cmxa(OUnit2),
       /opt/local/lib/ocaml/site-lib/oUnit/oUnit.cmxa(OUnit)
     OUnitRunner referenced from /opt/local/lib/ocaml/site-lib/oUnit/oUnit.cmxa(OUnit)
     OUnitChooser referenced from /opt/local/lib/ocaml/site-lib/oUnit/oUnit.cmxa(OUnit)
     OUnitLogger referenced from /opt/local/lib/ocaml/site-lib/oUnit/oUnit.cmxa(OUnit2),
       /opt/local/lib/ocaml/site-lib/oUnit/oUnit.cmxa(OUnit)
     OUnitTestData referenced from /opt/local/lib/ocaml/site-lib/oUnit/oUnit.cmxa(OUnit2)
Command exited with code 2.
Compilation unsuccessful after building 646 targets (645 cached) in 00:00:02.
4

2 に答える 2

4

あなたの最初のエラーはおそらく、あなたの OS はファイル名の大文字と小文字を区別しないが、OCaml は区別するからです:

$ ocamlobjinfo `ocamlfind query oUnit`/oUnit.cmi
File /mnt/home/jun/.opam/system/lib/oUnit/oUnit.cmi
Unit name: OUnit
Interfaces imported:
    cb146e345f0b34fc8ad4b5afe69d1f20    OUnit
    ...

モジュールが「Ounit」ではなく「OUnit」と呼ばれていることがわかります。

2 番目のエラーは明らかに、ライブラリがまだ REPL にロードされていないためです。REPL は関数の存在を認識していますが、コードがロードされていません。ライブラリとそれが依存するライブラリをロードすると、アクセス可能になります。

ocaml -I `ocamlfind query oUnit` unix.cma oUnitAdvanced.cma oUnit.cma
        OCaml version 4.01.0

# OUnit.assert_equal;;
- : ?cmp:('a -> 'a -> bool) ->
    ?printer:('a -> string) ->
    ?pp_diff:(Format.formatter -> 'a * 'a -> unit) ->
    ?msg:string -> 'a -> 'a -> unit
= <fun>
于 2014-01-06T05:40:59.660 に答える
0

ocamlbuild呼び出しを使用に変更することで問題を解決しました。これにより-use-ocamlfind、すべてのパスの混乱を回避できるようです。

また、すべての OCaml モジュールをアンインストールし、代わりに OPAM をインストールしてから、OUnit などを OPAM 経由でインストールし、再ログインして環境を整えました。

今私のために働くビルドコマンドは

ocamlbuild \
    -use-ocamlfind \
    -libs   graph \
    -pkgs   str,unix,ounit \
    -cflags -g,-w,+a-4,-warn-error,+a-4,-I,/opt/local/lib/ocaml/site-lib/ocamlgraph \
    -lflags -g,-I,/opt/local/lib/ocaml/site-lib/ocamlgraph \
    ./AllTests.native

これは、更新されたビルド スクリプトによって生成されます

(* Usage: ocaml make.ml [<ModuleToBuild>.{byte,native}] *)

#load "unix.cma";;

let args = match Array.to_list Sys.argv with
  | []      -> failwith "no program on argv"
  | _::[]   -> ["AllTests.byte"]
  | _::argv -> argv

let library_paths = [
  (* TODO: Figure out why `opam install ocamlgraph` fails *)
  "-I"; "/opt/local/lib/ocaml/site-lib/ocamlgraph";
]

(* If the -p flag is first in the argument list, then replace it
   with a host of flags that enable profiling via ocamlprof. *)
let args, c_opt_flags, l_opt_flags =
  match args with
    | "-p"::rest ->
      (* Treat the targets as debug and profile targets. *)
      "-tags"::"debug,profile"
      (* Use profiling versions of the compilers which instrument
         various flow control constructs with entry counters. *)
      ::"-ocamlc"::"ocamlcp"
      ::"-ocamlopt"::"ocamloptp"
      ::rest,
      (* Instrument all available points. *)
      ["-P"; "a"],
      (* Link with a wrapper that dumps profiling data if program
         exits noramlly. *)
      ["-p"]
    | _ -> args, [], []

let standard_flags = [
  "-use-ocamlfind";
  (* TODO: Figure out why `opam install ocamlgraph` fails *)
  "-libs"; "graph";
  "-pkgs"; "str,unix,ounit";  (* TODO: graph *)
  "-cflags"; (String.concat "," (
    [
      "-g";
      "-w"; "+a-4";
      "-warn-error"; "+a-4";
    ]
    @ c_opt_flags
    @ library_paths));
  "-lflags"; (String.concat "," (
    [
      "-g";
    ]
    @ l_opt_flags
    @ library_paths));
]

let build_command = "ocamlbuild"

let argv = build_command::(standard_flags @ args)

let _ = begin
  Printf.printf "%s\n" (String.concat " \\\n\t" argv);
  flush stdout;
  Unix.execvp build_command (Array.of_list argv);
end;;
于 2014-01-07T17:34:24.847 に答える