问题描述
我在尝试使用 .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.cma
和 cd _build/default/lib; utop a.cma
都不成功,我无法使用模块 A
:
utop # A.f;;
Line 1,characters 0-3:
Error: Unbound module A
我知道 dune utop
命令,但是如果我想在没有安装 dune
的其他地方导出/共享我的库怎么办?我应该做些什么?我是否以错误的方式使用 dune
?提前致谢
库/沙丘
(library
(name a))
解决方法
您需要使 .a.objs/byte
中的字节码目标文件可见。例如:
#directory ".a.objs/byte"
(对于图书馆用户来说,这些文件照常安装)
另请注意,dune 默认处于包装模式:库 M
中的模块 Lib
可作为 Lib.M
访问,除非用户定义了具有相同将 Lib
命名为整个库。