关于 .cma 文件的沙丘行为

Dune behaviour regarding .cma files

我在尝试使用 dune 实用程序创建 .cma 文件(库)时遇到了一些问题。我有以下项目树:

.
├── _build
│   ├── default
│   │   ├── dune
│   │   └── lib
│   │       ├── a.a
│   │       ├── a.cma
│   │       ├── a.cmxa
│   │       ├── a.cmxs
│   │       ├── a.ml
│   │       └── dune
│   └── log
├── dune
├── dune-project
└── lib
    ├── a.ml
    └── dune

其中a.ml声明了一个非常简单的函数f,作为例子。当我直接 运行 ocamlc -o a.cma -a a.ml,然后启动 utop a.cma,我可以根据需要执行以下命令:

utop # A.f;;
- : int -> int = <fun>

另一方面,在使用一次 dune build(生成 _build 目录及其子目录)后,我得到的 _build/default/lib/a.cma 文件占用了 10 倍much space 作为手动生成的,更重要的是,它不起作用。 utop _build/default/lib/a.cmacd _build/default/lib; utop a.cma 两个命令都不成功,我无法使用模块 A:

utop # A.f;;
Line 1, characters 0-3:
Error: Unbound module A

我知道 dune utop 命令,但是如果我想 export/share 我的库在其他地方,而 dune 没有安装怎么办?我应该做些什么?我使用 dune 的方式有误吗?提前谢谢你


PS: 文件内容:

lib/dune

(library
 (name a))

您需要使 .a.objs/byte 中的字节码目标文件可见。例如:

#directory ".a.objs/byte"

(图书馆用户照常安装这些文件)

另请注意,dune 默认处于包装模式:库 Lib 中的模块 M 可作为 Lib.M 访问,除非用户使用与整个图书馆同名Lib