簡體   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