Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OCaml静态检测标准发行版中对非普及库的依赖性_Ocaml_Ocamlfind - Fatal编程技术网

OCaml静态检测标准发行版中对非普及库的依赖性

OCaml静态检测标准发行版中对非普及库的依赖性,ocaml,ocamlfind,Ocaml,Ocamlfind,与OCaml一起提供的某些模块,如Unix和Bigarray在ocamlopt-where中有自己的.cmx和.cmxa文件(在我当前的opam交换机中的系统上是~/.opam/4.03.0/lib/OCaml) 有没有办法在不编译的情况下确定哪些源文件依赖于标准发行版中的哪些“特殊”库?我打算稍后在Makefile中使用这个输出 下面的程序example.ml open Unix;; Unix.system "echo hi";; 可以使用ocamlfind ocamlopt-packag

与OCaml一起提供的某些模块,如
Unix
Bigarray
ocamlopt-where
中有自己的
.cmx
.cmxa
文件(在我当前的opam交换机中的系统上是
~/.opam/4.03.0/lib/OCaml

有没有办法在不编译的情况下确定哪些源文件依赖于标准发行版中的哪些“特殊”库?我打算稍后在Makefile中使用这个输出

下面的程序
example.ml

open Unix;;

Unix.system "echo hi";;
可以使用
ocamlfind ocamlopt-package unix-linkpkg example.ml
编译。我不知道如何在不经过
ocamlfind
包装的情况下编译它

我想知道是否有一种方法可以静态地检测此文件模块
Unix
中的未绑定文件是否对应于标准发行版中的“某物”,并将
Unix.cmxa
作为依赖项报告<默认情况下,code>ocamldep似乎不会将其报告为依赖项

ocamldep-all example.ml
只报告可以使用
example.ml
生成的各种对象和接口文件取决于
example.ml
。我希望收到一条错误消息,抱怨ocamldep不理解
Unix
模块,或者有一些迹象表明构建对象需要它

$ ocamldep -all example.ml
example.cmo example.cmi : example.ml
example.cmx example.o example.cmi : example.ml

我知道你的问题是:

对于给定的模块名,例如Unix,我们如何找到提供它的库

不幸的是,目前还没有这样的工具

如果我们将搜索空间限制在OCaml编译器本身附带的库中,我会:

$ ocamlobjinfo $HOME/.opam/4.03.0/lib/ocaml/*.cma | grep '^\(File\|Unit name\)'
这将列出每个存档中定义的所有模块。您可能在结果中找到模块名称,也可能找不到模块名称


一般来说,这是不可能的,因为您寻找的库可能不是标准库,也可能不是本地安装的。您可以使用API搜索引擎,如ocamloscope,但它们当然不会涵盖所有编写的OCaml库。

我知道您的问题是:

对于给定的模块名,例如Unix,我们如何找到提供它的库

不幸的是,目前还没有这样的工具

如果我们将搜索空间限制在OCaml编译器本身附带的库中,我会:

$ ocamlobjinfo $HOME/.opam/4.03.0/lib/ocaml/*.cma | grep '^\(File\|Unit name\)'
这将列出每个存档中定义的所有模块。您可能在结果中找到模块名称,也可能找不到模块名称


一般来说,这是不可能的,因为您寻找的库可能不是标准库,也可能不是本地安装的。您可以使用像ocamloscope这样的API搜索引擎,但它们当然不会涵盖所有编写的OCaml库。

尽管模块可能被打包到具有任意名称的库中,但模块接口仍然保留顶级模块名称和编译模块接口文件名之间的一对一映射。因此,如果出现错误“Unbound module Xxx”,可以执行以下操作

find ~/.opam -iname Xxx.cmi
如果您没有找到任何库,则表示未安装此类库。目前,还没有成熟的方法来确定哪个软件包提供了这个模块,你可以使用谷歌,在邮件列表或论坛上询问人们,或者尝试使用
apt file
,希望这个库是标准发行版

如果搜索只返回一个文件夹,那么你很幸运,你得到了这个包。该包可能包含不同类型的对象文件(.cmx-表示本机代码,.cmo-表示字节码)以及库(.cma-是.cmo的集合,.cmxa-是.cmx的集合,.cmxs是.cmxs的动态版本)。OCaml的灵活性既有好处也有坏处,允许丢失这些文件中的任何一个。彬彬有礼的库通常提供所有这些文件,并且具有包名与库名匹配的命名约定。但是,如果您使用的是
ocamlfind
,并且文件夹中有元文件,那么文件夹的名称就是需要传递到
ocamlfind
的包的名称,以便从该包链接库


如果您有多个结果,那么您需要使用常识来确定需要使用两个库中的哪一个。或者,您可以尝试使用一个和另一个,并查看编译的是哪一个

尽管模块可能被打包到具有任意名称的库中,但模块接口仍然保留顶级模块名称和编译模块接口文件名之间的一对一映射。因此,如果出现错误“Unbound module Xxx”,可以执行以下操作

find ~/.opam -iname Xxx.cmi
如果您没有找到任何库,则表示未安装此类库。目前,还没有成熟的方法来确定哪个软件包提供了这个模块,你可以使用谷歌,在邮件列表或论坛上询问人们,或者尝试使用
apt file
,希望这个库是标准发行版

如果搜索只返回一个文件夹,那么你很幸运,你得到了这个包。该包可能包含不同类型的对象文件(.cmx-表示本机代码,.cmo-表示字节码)以及库(.cma-是.cmo的集合,.cmxa-是.cmx的集合,.cmxs是.cmxs的动态版本)。OCaml的灵活性既有好处也有坏处,允许丢失这些文件中的任何一个。彬彬有礼的库通常提供所有这些文件,并且具有包名与库名匹配的命名约定。但是,如果您使用的是
ocamlfind
,并且文件夹中有元文件,那么文件夹的名称就是需要传递到
ocamlfind
的包的名称,以便从该包链接库

如果您有多个结果,那么您需要使用常识来确定需要使用两个库中的哪一个。或者,您可以尝试使用一个和另一个,看看哪一个compi