告诉 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
),您可以在启动后发出以下命令 ocaml
1
#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";;
我是 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
),您可以在启动后发出以下命令 ocaml
1
#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";;