正确编译子文件夹中的模块(ocamlbuild)

时间:2010-02-05 18:49:15

标签: compilation ocaml ocamlbuild

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

我能够通过使用一些基本规则修改myocamlbuild来成功包含外部项目(调用ocaml_lib,我将在其他时间使用ocamlfind),但我仍然坚持如何将文件夹作为模块包含在内项目得当。我创建了一个parser.mlpack文件并填入了要包含的适当模块(例如,“parser / Date”等等),在目录的根目录中为它们的实现写了一个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未包含在上述链接阶段;实际上没有包含任何与解析器相关的文件!

编辑:在评论中添加了新的详细信息,并在下面给出答案。

2 个答案:

答案 0 :(得分:4)

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

中执行此操作
"parser": include

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

答案 1 :(得分:3)

我想知道parser.mli是否在某种程度上干扰了处理mlpack文件的依赖关系。处理和编译parser.cmi时,将从包操作生成parser.mlpack。尝试删除parser.mli文件构建。如果可行,那么可以将其重新处理为真实的答案。

此外,如果parser/位于parser.mlpack目录中并且您拥有parser.mlpack,则parser中的模块不需要include作为前缀标签集。但这不应该对此产生影响。

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