将电池相关文件加载到ocamltop中--接口不一致

将电池相关文件加载到ocamltop中--接口不一致,ocaml,ocaml-batteries,Ocaml,Ocaml Batteries,这是一个简单的ocaml文件,旨在让我了解如何将使用电池库的程序加载到ocamltop中 batteryassault.ml 我用 ocamlfind ocamlc -package batteries -linkpkg batteryassault.ml 生成batteryassault.cmo和batteryassault.cmi,没有错误或警告。然后,我启动电池供电的ocamltop rlwrap ocamlfind batteries/ocaml 最后,要在ocamltop中加载文件

这是一个简单的ocaml文件,旨在让我了解如何将使用电池库的程序加载到ocamltop中

batteryassault.ml

我用

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/batters/batters.cma 关于接口电池的分歧

我想可能是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版本


所以我的问题是:有什么解决方法?

通常我建议删除系统OCaml安装。否则你可能会有这样的错误

您应该确保所有工具和库都来自同一个源,在本例中是来自opam

一个常见的错误是忘记打电话

eval `opam config env`
在某个时刻。稍后您可能会回忆起这一点,并激活您的opam,从而最终使用应用程序的某些部分,甚至使用opam构建opam堆栈,并使用系统库构建其他部分。如果你犯了这样的错误,就很难猜出什么时候出了问题,什么地方出了问题

但如果您仍然不想卸下系统电池,则需要非常小心。例如,由于ocamlfind BATTERS/ocaml导致加载旧版本的电池,因此您可以尝试使用此技巧,以确保从opam加载电池topleve:

$ `opam config var batteries:lib`/ocaml
如果问题仍然存在,则意味着您的系统确实已损坏。考虑删除你的OPAM栈,从头开始仔细地做每件事。例如:

 rm -rf ~/.opam
 opam init --comp=4.02.1
 eval `opam config env`
 opam install batteries

此外,使用rlwrap~/.opam/system/lib/batters/ocaml启动ocamltop也没有帮助。
 rm -rf ~/.opam
 opam init --comp=4.02.1
 eval `opam config env`
 opam install batteries