告诉OCaml opam包在哪里

告诉OCaml opam包在哪里,ocaml,development-environment,opam,Ocaml,Development Environment,Opam,我对OCaml还很陌生。我曾尝试在两台不同的计算机上从头开始安装它——都是LinuxMint——但两次都遇到了这个问题 当我安装带有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 "co

我对OCaml还很陌生。我曾尝试在两台不同的计算机上从头开始安装它——都是LinuxMint——但两次都遇到了这个问题

当我安装带有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/包中


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

Yawar在评论中建议的修复方法对我有效。我安装了沙丘

$ opam install dune
然后我执行了

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

文件myproject/helloworld.ml(注意不需要“openbase”)

文件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 interactive toplevel,即
REPL
,即
OCaml
实用程序(或
utop
),可以在启动
OCaml
1后发出以下命令

然后,您可以执行
openbase
(只打开名称空间)并使用
Base
库提供的其他模块

topfind
功能可能未安装在新的opam交换机上,因此请确保它已安装到位

opam install ocamlfind
此外,为了快速构建一个简单的应用程序,您可以使用ocamlbuild而不是dune,例如,假设主二进制文件的代码在文件
example.ml
中,并且您希望使用
base

ocamlbuild -package base example.native

1) 这里的
#
字符是输入的一部分,而不是提示,也就是说,您必须键入它,因此它看起来像

# #use "topfind";;

Base
这样的模块对于
ocaml
命令是不可见的。您需要使用Dune build工具来设置一个项目,告诉
ocaml
在哪里可以找到已安装的软件包及其模块。有关快速入门示例,请参阅。谢谢!这两种解决方案对我都很有效——REPL#use#require解决方案,以及编译ocamlbuild解决方案(我也必须“opam安装ocamlbuild”)。@请注意,不要使用ocamlbuild,使用Dune。OCaml社区推荐使用后者。事实上,即使是ocamlbuild自述文件也建议改用Dune。@通常,请注意,使用ocamlbuild完全可以,特别是对于简单的项目和一次性二进制文件,完全没有必要使用Dune这样的重炮。ocamlbuild没有什么问题,它为我们服务了多年,得到了支持,并将进一步提供服务。还有omake、oasis和许多其他自动化工具,有些更好,有些更差,但我们不要开始,所以不是推荐这些工具或程序,而是使用它们。感谢这两种观点!谢谢,这对我有用!(我想我必须“opam安装ocamlfind”)。ivg提供了一个类似的使用OCAMLBILD的一行程序,该程序同样有效。
ocamlbuild -package base example.native
# #use "topfind";;