我在链接一个非常简单的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/core
0包和标准库替换实际上是可选的;你可能实际上并不需要它们。如果你是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
关于文件过期的注意事项:如果你能告诉我们你从哪里得到的指示会让你陷入困惑,那会很有帮助。在清理安装说明和更新文档方面做了很多工作,但不幸的是,有很多过时的入门指南。我在这个答案顶部提供的"启动和运行"链接是最好的资源。