将依赖于电池的文件加载到ocamltop中 - 接口不同意

时间:2015-04-23 05:03:05

标签: ocaml ocaml-batteries

这是一个简单的ocaml文件,只是为了让我了解如何将使用电池库的程序加载到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   不同意界面电池

我认为可能会发生的事情是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版本。

所以我的问题是:/是否有解决方法?

1 个答案:

答案 0 :(得分:0)

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

您应确保所有工具和库来自同一来源,在此特定情况下来自opam。

通常的错误是忘记致电

eval `opam config env`

在某个时候。您可能会在稍后回忆起这个问题,然后激活您的opam,从而结束您的部分应用程序,甚至使用opam构建的opam堆栈以及使用系统库构建的其他部分。如果你犯了这样的错误,就很难猜出,何时以及出了什么问题。

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

$ `opam config var batteries:lib`/ocaml

如果问题仍然存在,则表示您的系统确实已损坏。考虑删除你的opam堆栈并从头开始仔细制作。如,

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