2010-02-05 72 views
9

我最近决定组织我的项目目录中的文件。我把我有几种不同文件类型的解析器移动到他们自己的目录中,并决定使用ocamlbuild(随着项目变得越来越复杂,简单的shell脚本不再足够)。正确编译子文件夹中的模块(ocamlbuild)

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

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

我觉得我可能会做些多余的事情,但无论如何,项目仍然找不到解析器模块时,我编译!

谢谢!

_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不包括在上面的链接阶段;实际上没有包含解析器相关的文件!

编辑:在下面的评论和回答中添加新的细节。

回答

3

我不知道是否parser.mli在某种程度上干扰了处理mlpack文件的依赖性。将在处理和编译parser.mlpack时从包操作生成parser.cmi。尝试删除parser.mli文件的构建。如果这有效,那么这可以重新处理成一个真正的答案。

而且,你不需要parser/作为一个前缀为您的模块parser.mlpack如果parser.mlpack是在parser目录,你有include标签设置。但是,这不应该有所作为。

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

+0

是的,这工作,但没有预期的后果。表示目录内容的模块未创建;它们直接由子模块引用。 '-pack'参数在编译期间会添加到适当的模块中。但不用于最终产品。我的解释是关于-pack不正确的吗? – nlucaroni 2010-02-08 18:06:12

+0

'-pack'应创建一个包含其他模块作为子模块的模块。您的其他代码必须将它们称为它们的子模块(例如'Parser.ConfParser');如果它直接引用它们(只要'ConfParser'没有首先打开'Parser'),那么事情就会变得混乱。 你能张贴'-verbose'输出,当你没有'parser.mli'? – 2010-02-08 18:12:00

+1

我添加了parser.mli文件。我认为出于某种原因编译该包时出现错误并没有打破它应该的位置。 **我的'mlpack'文件中有一个额外的模块,我移动了**。 – nlucaroni 2010-02-08 20:46:57

4

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

"parser": include 

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

+1

当然应该是 - >“parser”:include – ygrek 2010-02-08 05:30:52

+0

@ygrek谢谢 - 已更新。 – 2010-02-08 14:55:38

+0

...我修改了上面的问题。这有帮助,但我实际上已经这样做了,但是来自命令行与'-I parser'的等价。现在,我只是用'ocamlbuild项目来构建。 ' – nlucaroni 2010-02-08 15:43:38

相关问题