0

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

电池突击.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 版本。

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

4

1 回答 1

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
于 2015-04-23T10:20:40.573 回答