10

我最近决定在我的项目目录中组织文件。我将针对几种不同文件类型的解析器移动到它们自己的目录中,并决定使用 ocamlbuild(因为项目变得越来越复杂,简单的 shell 脚本不再足够)。

我能够通过使用一些基本规则修改 myocamlbuild 成功地包含外部项目(调用ocaml_lib,我将在其他时间使用 ocamlfind ),但我坚持如何将文件夹作为模块正确包含到项目中。我创建了一个parser.mlpack文件并用要包含的正确模块填充它(例如,“解析器/日期”等),parser.mli在目录的根目录中为它们的实现写了一个,并修改了_tags文件(见下文)。

在编译过程中,正确遍历了解析器目录,并且parser.cmi,parser.mli.depends都在该_build目录中创建;以及*.cm[xio]解析器子目录中的所有文件。

我觉得我可能做了一些多余的事情,但无论如何,当我编译时,项目仍然找不到 Parser 模块!

谢谢!

_tags

debug : true
<*.ml> : annot
"parser" : include
<parser/*.cmx>: for-pack(Parser)
<curlIO.*> : use_curl
<mySQL.*> : use_mysql
<**/*.native> or <**/*.byte> : use_str,use_unix,use_curl,use_mysql

编译错误

/usr/local/bin/ocamlopt.opt unix.cmxa str.cmxa -g -I /usr/local/lib/ocaml/site-lib/mysql mysql.cmxa -I /usr/local/lib/ocaml/curl curl.cmxa curlIO.cmx utilities.cmx date.cmx fraction.cmx logger.cmx mySQL.cmx data.cmx project.cmx -o project.native  
File "\_none\_", line 1, characters 0-1:  
Error: **No implementations provided for the following modules:**
         Parser referenced from project.cmx  
Command exited with code 2.  

您会注意到-I parser上面的链接阶段不包括在内;实际上没有包含任何与解析器相关的文件!

编辑:从下面的评论和答案中添加了新的细节。

4

2 回答 2

4

您需要在搜索路径中“包含”解析器目录。你可以这样做_tags

"parser": include

然后ocamlbuild可以在解析器目录中搜索感兴趣的文件。

于 2010-02-08T04:23:06.393 回答
3

我想知道parser.mli在处理 mlpack 文件时是否会以某种方式干扰依赖项。 parser.cmi将在parser.mlpack处理和编译时从打包操作中生成。尝试在parser.mli删除文件的情况下进行构建。如果可行,则可以将其重新处理为真正的答案。

此外,如果在目录中并且您有标记集,则不需要parser/作为模块的前缀。但这不应该对此产生影响。parser.mlpackparser.mlpackparserinclude

更新:这解决了问题,但不是根本原因。根据下面的评论,根本原因是.mlpack已重新定位的文件中提到的文件。

于 2010-02-08T17:20:35.233 回答