告诉 OCaml opam 包在哪里

Telling OCaml where opam packages are

我是 OCaml 的新手。我已经尝试在两台不同的计算机上从头开始安装它——都是 Linux Mint——并且两次都遇到了这个问题。

当我用 opam 安装包时(特别是 Base,但它也发生在 Core 上),OCaml 找不到它。

$ opam install Base
[NOTE] Package base is already installed (current version is v0.11.1).
$ ocaml -open Base
    OCaml version 4.05.0

File "command line", line 1:
Error: Unbound module Base

ocaml 似乎在 /usr/lib/ocaml 中,它的二进制文件在 /usr/bin/ 中,而 opam 似乎将所有内容都放在 ~/.opam/packages.

如何让 OCaml 查看随 opam 安装的包?我发现许多涉及未绑定模块的问答错误,但 none 似乎为我修复了它,或者它们似乎已过时。另外,我知道我的包管理器 OCaml 不是完全最新的,但我也从源代码安装了 4.10.0,但仍然有问题。

Yawar 在评论中建议的修复对我有用。我用

安装了沙丘
$ opam install dune

然后我执行了

$ eval $(opam config env)

为了在我的终端中设置 opam。 (我似乎每次打开终端时都需要 运行 这个,尽管对所有 opam 安装都说是,所以我可能会把它添加到 ~/.profile。)

文件myproject/helloworld.ml(注意不需要"open Base")

Base.Printf.ifprintf "Hello, World\n"  (* doesn't actually print anything *)

文件myproject/dune

(executable
  (name helloworld)
  (libraries base))

那我运行

$ dune build helloworld.exe

您可以通过传递库的位置来告诉 OCaml 编译器您的 Opam 包在哪里:

ocamlopt -I /path/to/lib/base /path/to/lib/base/base.cmxa helloword.ml

对于像 base 这样的库,由于存在各种依赖关系,查找所有参数可能会变得乏味。因此,您可以改为使用 ocamlfind 包装器为您传递参数:

ocamlfind ocamlopt -package base -linkpkg helloword.ml

为了完成答案的范围,如果您需要将已安装的包加载到 OCaml 交互式顶层,又名 REPL,又名 ocaml 实用程序(或 utop),您可以在启动后发出以下命令 ocaml1

#use "topfind";;
#require "base";;

然后您可以执行 open Base(这只会打开命名空间)并使用 base 库提供的其他模块。

topfind 工具可能未安装在新的 opam 交换机上,因此请确保

opam install ocamlfind

此外,要快速构建一个简单的应用程序,您可以使用 ocamlbuild 而不是 dune,例如,假定主二进制文件的代码在文件 example.ml 中并且您想要使用 base图书馆,

ocamlbuild -package base example.native

1) 这里的 # 字符是输入的一部分,不是提示符,也就是说,你必须输入它,所以它看起来像

# #use "topfind";;