[英]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.