我最近决定组织我的项目目录中的文件。我把我有几种不同文件类型的解析器移动到他们自己的目录中,并决定使用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
不包括在上面的链接阶段;实际上没有包含解析器相关的文件!
编辑:在下面的评论和回答中添加新的细节。
是的,这工作,但没有预期的后果。表示目录内容的模块未创建;它们直接由子模块引用。 '-pack'参数在编译期间会添加到适当的模块中。但不用于最终产品。我的解释是关于-pack不正确的吗? – nlucaroni 2010-02-08 18:06:12
'-pack'应创建一个包含其他模块作为子模块的模块。您的其他代码必须将它们称为它们的子模块(例如'Parser.ConfParser');如果它直接引用它们(只要'ConfParser'没有首先打开'Parser'),那么事情就会变得混乱。 你能张贴'-verbose'输出,当你没有'parser.mli'? – 2010-02-08 18:12:00
我添加了parser.mli文件。我认为出于某种原因编译该包时出现错误并没有打破它应该的位置。 **我的'mlpack'文件中有一个额外的模块,我移动了**。 – nlucaroni 2010-02-08 20:46:57