0

これは簡単な ocaml ファイルです。これは、Batteries ライブラリを使用するプログラムを ocamltop にロードする方法を理解してもらうためのものです。

batteryassault.ml

open Batteries

let main = print_string "hello, world ... powered on"

これをバイトコードにコンパイルします

ocamlfind ocamlc -package batteries -linkpkg batteryassault.ml

結果は batteryassault.cmo と batteryassault.cmi になり、エラーも警告もありません。次に、バッテリー駆動の ocamltop を起動します。

rlwrap ocamlfind batteries/ocaml

最後に、ファイルを ocamltop にロードするには:

#load "batteryassault.cmo" ;;

そして、エラーが発生します。

ファイル batteryassault.cmo と /usr/lib/ocaml/batteries/batteries.cma はインターフェース Batteries について意見が一致していません

Ubuntu がバッテリー 2.2.1 をインストールしている可能性があると思いますが、何らかの理由で (merlin をインストールしていますか?) opam フォルダーにバッテリー 2.3.1 がインストールされています。さらに、上記のようにバッテリーを使用して ocamltop を起動すると、 ocamltop が 2.2.1 バージョンを使用していることを示します。さらに、でコンパイル

ocamlfind ocamlc -package batteries -linkpkg batteryassault.ml -verbose

ocamlc は間違いなく opam のライブラリ、つまり 2.3.1 バージョンを使用していることがわかります。

だから私の質問は次のとおりです。/回避策は何ですか?

4

1 に答える 1

0

通常、システムの OCaml インストールを完全に削除することをお勧めします。そうしないと、このようなエラーが発生する可能性があります。

すべてのツールとライブラリが同じソース、この特定のケースでは opam からのものであることを確認する必要があります。

通常のエラーは、呼び出しを忘れることです

eval `opam config env`

ある時点で。後でこれについて思い出して、opam をアクティブ化すると、アプリケーションの一部、またはopamシステム ライブラリで構築された他の部分を使用して構築された opam スタックでさえ終了する可能性があります。そのようなエラーを犯した場合、いつ、何が問題になるかを推測するのは困難です。

ただし、それでもシステムのバッテリーを取り外したくない場合は、十分に注意する必要があります。たとえば、ocamlfind batteries/ocaml古いバージョンのバッテリーをロードする結果になるため、このトリックを使用して、バッテリー topleve が opam からロードされることを確認できます。

$ `opam config var batteries:lib`/ocaml

問題が解決しない場合は、システムが本当に壊れていることを意味します。opam スタックを削除し、すべてを最初から慎重に作成することを検討してください。例えば、

 rm -rf ~/.opam
 opam init --comp=4.02.1
 eval `opam config env`
 opam install batteries
于 2015-04-23T10:20:40.573 に答える