这是一个简单的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,没有错误或警告。然后,我用
启动电池供电的ocamltoprlwrap 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版本。
所以我的问题是:/是否有解决方法?
答案 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