OCaml 错误:所需的模块"Core__Core_sys"不可用



我在链接一个非常简单的OCaml程序时遇到问题:

open Core
Format.printf "hello world %sn"  "foobar";;
Format.printf "argv= %sn" (Sys.get_argv()).(0) ;;

我用编译的

ocamlfind ocamlc -thread -package core visitor.ml

编译步骤总是生成错误:

Error: Required module `Core__Core_sys' is unavailable

我已经固定了4.0.9版本,我可以看到文件:

$ ocamlfind query core
/home/ubuntu/.opam/4.09.0/lib/core

CCD_ 1显示

-rw-r--r--   1 ubuntu ubuntu    17891 Dec  3 20:14 core__Core_sys.cmi
-rw-r--r--   1 ubuntu ubuntu    93777 Dec  3 20:14 core__Core_sys.cmt
-rw-r--r--   1 ubuntu ubuntu    75659 Dec  3 20:14 core__Core_sys.cmti
-rw-r--r--   1 ubuntu ubuntu    16958 Dec  3 20:14 core__Core_sys.cmx

我想的都试过了,但没有成功。顺便说一句,我注意到文件https://ocaml.org/api/Sys.html完全没有提到get_argv,但如果我只尝试简单的Sys.argv,我会收到警告:

# Sys.argv ;;
Alert deprecated: Core.Sys.argv
[since 2019-08] Use [Sys.get_argv] instead, which has the correct behavior when [caml_sys_modify_argv] is called.

因此,我得出结论,在OCaml.org上发布的核心OCaml文档已经过时两年多了!如何获得最新的文档,最好是描述这些新手错误的文档?

您需要通过添加-linkpkg标志来链接包:

ocamlfind ocamlc -thread -package core -linkpkg visitor.ml

几点。首先,看起来您使用的是相当旧的OCaml版本。除非您出于某种原因需要继续使用4.09,否则我强烈建议您升级到最新版本4.13.1。安装说明如下:https://ocaml.org/learn/tutorials/up_and_running.html

如果您有任何问题,请尝试升级到最新版本的opam(OCaml包管理器(,并执行opam update以下载最新的包索引。

其次,看起来您正在尝试使用Jane Street的Core库,这是一个第三方包,旨在作为标准库的替代品。因此,它有自己版本的OCaml标准库的Sys模块,即Core.Sys。关于您收到的警报,Jane Street Core实际上不赞成使用Core.Sys.argv值:https://ocaml.janestreet.com/ocaml-core/latest/doc/core/Core__/Core_sys/index.html#val-argv

get_argv((的单个结果。此值已被无限期否决。它是为了兼容性而保留的。。。

这就引出了最后一个问题,当您尝试编译时,无法找到core包。这里有几个选择。首先,一种选择是$ ls -la /home/ubuntu/.opam/4.09.0/lib/core0包和标准库替换实际上是可选的;你可能实际上并不需要它们。如果你是OCaml的初学者,你可以尝试只使用标准库(所以没有open Core,也没有尝试使用core包进行编译(。

如果您决定继续使用core包,另一个选项是使用沙丘构建系统,而不是ocamlfind。Dune是一个强大的现代OCaml构建系统,在构建过程中几乎可以处理包链接的所有方面,因此您不需要担心发出单独的编译命令。

以下是dune文件的样子:

(executable
(name visitor)
(libraries core))

visitor.ml文件将在同一目录中:

let () =
Printf.printf "hello world %sn" "foobar";
Printf.printf "argv= %sn" Sys.argv.(0)

然后你会运行:

dune exec ./visitor.exe

.exe是一个沙丘约定,跨操作系统的可执行文件都有这个扩展。

最后,在源代码中,您根本不需要;;。点击此处了解更多信息:https://discuss.ocaml.org/t/terminate-a-line-with-or-or-in-or-nothing/8941/21?u=yawaramin

关于文件过期的注意事项:如果你能告诉我们你从哪里得到的指示会让你陷入困惑,那会很有帮助。在清理安装说明和更新文档方面做了很多工作,但不幸的是,有很多过时的入门指南。我在这个答案顶部提供的"启动和运行"链接是最好的资源。

相关内容

  • 没有找到相关文章

最新更新