OCaml /沙丘构建中的未绑定模块

时间:2019-01-06 02:26:47

标签: ocaml opam ocaml-dune

我第一次尝试使用OCaml,并尝试一起构建几个文件。

当我跑步时:

dune build bin/main.exe

我得到:

    ocamlc bin/.main.eobjs/main.{cmi,cmo,cmt} (exit 2)
(cd _build/default && /usr/bin/ocamlc.opt -w @a-4-29-40-41-42-44-45-48-58-59-60-40 -strict-sequence -strict-formats -short-paths -keep-locs -g -bin-annot -I bin/.main.eobjs -I lib/.lib.objs -no-alias-deps -opaque -o bin/.main.eobjs/main.cmo -c -impl bin/main.ml)
File "bin/main.ml", line 10, characters 17-25:
Error: Unbound module Rule

这是我的bin / main.ml文件:

open Lib

let () =
    let result = Math.add 2 3 in
    print_endline (string_of_int result);
    let result = Math.sub 3 1 in
    print_endline (string_of_int result);
    let result = Zoom.barf 3 1 in
    print_endline (string_of_int result);
    let result = Rule.add 3 1 in
    print_endline (string_of_int result);
lib / inner / rule.ml中的

包含:

let add x y = x + y
let sub x y = x - y

所以我认为我需要以某种方式将rule.ml文件导入bin/main.ml文件中?

1 个答案:

答案 0 :(得分:5)

在Dune中,当前默认设置是不同目录中的模块彼此不可见。这由(include_subdirs no)节(https://dune.readthedocs.io/en/latest/dune-files.html#include-subdirs)控制。使用此设置,要使模块彼此可见,需要在每个子目录中放置一个dune文件,其中包含正确的内容。如果您查看Dune项目本身的工作方式(https://github.com/ocaml/dune),您的目录结构将如下所示:

myproj/
  bin/
    dune
    main.ml
  lib/
    dune
    inner/
      dune
      rule.ml

根据需要,各个dune文件应包含正确的(library ...)https://dune.readthedocs.io/en/latest/dune-files.html#library)或(executable ...)https://dune.readthedocs.io/en/latest/dune-files.html#executable)节。

编辑:完成上述操作后,您还需要通过其完整的“路径”(即Rule)来引用Lib.Inner.Rule模块。