.cma
,你可以使用 objinfo
(也称为 ocamlobjinfo
,特别是在 Debian、Ubuntu 等系统中)获取它定义的模块。因此,只要给出库路径(如 /usr/lib/ocaml 等),并有足够的时间,就可以构建模块与 Ocaml 库之间的映射关系。首先,您实际上并不想知道要加载哪个cma文件,而是想通过ocamlfind知道要加载哪个包。下一件事要注意的是,ocaml编译器需要执行相同的操作来编译项目 - 即根据源代码中引用的模块的名称查找该模块的已编译接口。因此让我们模拟这种行为。编译器从命令行获取包含路径,但我们必须搜索所有可能的包含路径。所以我们开始吧:
for i in $(ocamlfind list | cut -d ' ' -f 1) ; do
if [ -r $(ocamlfind query $i)/XXX.cmi ] ; then
echo $i; break;
fi ;
done
或者
ocamlfind printconf path | xargs -n1 -I/ find / -name XXX.cmi
需要注意的是,从模块名称到文件名的映射并不是唯一的 - 例如,SomeModule
可以用 someModule.cmi
或 SomeModule.cmi
(较少见)来表示。
String
(对于string
数据类型的常规函数)不在str.cma
中,而是在Str
(用于操作正则表达式的函数)中。
nums.cma
名称也有类似的原因:它主要封装了模块Num
,该模块是不同“大数”库(Nat
、Big_int
、Ratio
)之上的一层。请注意,现在您可能想使用Zarith代替。
ocamlobjinfo
来构建一个映射表,将.cma
文件和定义的模块进行了关联以便于参考。
bigarray.cma
:
dbm.cma
:
dynlink.cma
:
graphics.cma
:
nums.cma
:
stdlib.cma
str.cma
:
toplevellib.cma
:
unix.cma
:
objinfo
,但由Debian打包为ocamlobjinfo
。 - gascheocamlobjinfo
来构建一个像你建议的映射。 - Matthew Piziak