繁体   English   中英

OCaml 错误:所需模块“Core__Core_sys”不可用

[英]OCaml Error: Required module `Core__Core_sys' is unavailable

我无法链接一个非常简单的 OCaml 程序:

open Core

Format.printf "hello world %s\n"  "foobar";;
Format.printf "argv= %s\n" (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

$ ls -la /home/ubuntu/.opam/4.09.0/lib/core显示

-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标志来链接 package:

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 package 管理器)并执行opam update以下载最新的 package 索引。

其次,您似乎正在尝试使用 Jane Street 的核心库,它是第三方 package,旨在作为标准库替代品。 因此,它有自己的 OCaml 标准库的Sys模块版本,即Core.Sys 关于您收到的警报, Core.Sys.argv值实际上已被 Jane Street Core 弃用: https://ocaml.janestreet.com/ocaml-core/latest/doc/core/Core__/Core_sys/index.html #val-argv

来自 get_argv () 的单个结果。 此值已无限期弃用。 它是为了兼容性而保留的...

这将我们引向最后一个问题,当您尝试编译时,它无法找到core package。 这里有几个选择。 首先,一个选项是core package和标准库替换实际上是可选的; 您可能实际上并不需要它们。 如果您是 OCaml 初学者,您可以尝试仅使用标准库(因此不要open Core ,不要尝试使用core包进行编译)。

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

这是dune文件的样子:

(executable
  (name visitor)
  (libraries core))

并且visitor.ml文件将位于同一目录中:

let () =
  Printf.printf "hello world %s\n" "foobar";
  Printf.printf "argv= %s\n" 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

关于文档已过时的注意事项:如果您能指出我们从哪里获得导致您出现这种混淆的说明,这将有所帮助。 清理安装说明和更新文档需要付出很多努力,但不幸的是,那里有很多过时的入门指南。 我在此答案顶部提供的“启动并运行”链接是最好的资源。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM