关于 .cma 文件的沙丘行为

问题描述

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

.
├── _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 文件占用了十倍的空间作为手动生成的,更重要的是,它不起作用。命令 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 命令,但是如果我想在没有安装 dune 的其他地方导出/共享我的库怎么办?我应该做些什么?我是否以错误的方式使用 dune?提前致谢


PS:文件内容

库/沙丘

(library
 (name a))

解决方法

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

#directory ".a.objs/byte"

(对于图书馆用户来说,这些文件照常安装)

另请注意,dune 默认处于包装模式:库 M 中的模块 Lib 可作为 Lib.M 访问,除非用户定义了具有相同将 Lib 命名为整个库。