Ocaml找不到Unix模块

dal*_*oss 1 unix ocaml opam

我(重新)使用以下步骤在OS X上安装了Ocaml:

> brew uninstall ocaml
> brew uninstall opam
> brew install ocaml
> brew install opam
> opam init
> eval `opam config env`
> opam switch 4.02.1
> opam install batteries core
Run Code Online (Sandbox Code Playgroud)

然后我尝试编译这个程序:

open Unix
open Printf

let main () =
    match fork () with
    | 0 -> printf "child\n"
    | pid -> printf "parent\n"

let _ = main ()
Run Code Online (Sandbox Code Playgroud)

我使用这个命令编译:

ocamlc -o fork fork.ml
Run Code Online (Sandbox Code Playgroud)

但是我收到一个错误:

File "fork.ml", line 1:
Error: Error while linking fork.cmo:
Reference to undefined global `Unix'
Run Code Online (Sandbox Code Playgroud)

事实上,我在重新安装之前遇到了这个错误; 这就是我首先重新安装的原因.但问题仍然存在,我不知道如何解决它.

ivg*_*ivg 6

unix 默认情况下,库没有链接,因此您需要传递一些链接标志,以使其工作,例如,

 ocamlc unix.cma fork.ml -o fork
Run Code Online (Sandbox Code Playgroud)

如果你不想知道任何事情cma,你可以使用ocamlbuild,而不是ocamlc:

 ocamlbuild -lib unix fork.native
Run Code Online (Sandbox Code Playgroud)

或者甚至更一般

 ocamlbuild -pkg unix fork.native
Run Code Online (Sandbox Code Playgroud)

后者(带pkg选项)将是一种首选方式,因为它允许您指定安装的任何包opam.例如,如果您尝试使用lwt,您可以直接与它链接

 ocamlbuild -pkg lwt fork.native
Run Code Online (Sandbox Code Playgroud)


Thr*_*unt 6

对于那些在使用 OCaml 交互式顶层时遇到此错误的人,命令行语法类似于ocamlc

ocaml unix.cma
Run Code Online (Sandbox Code Playgroud)

  • 您还可以在启动顶层后使用“#load”命令加载模块。 (2认同)