Compilation 正确编译子文件夹中的模块(ocamlbuild)
我最近决定在我的项目目录中组织文件。我将几个不同文件类型的解析器移到了它们自己的目录中,并决定使用ocamlbuild(随着项目变得越来越复杂,简单的shell脚本不再足够) 通过使用一些基本规则(调用Compilation 正确编译子文件夹中的模块(ocamlbuild),compilation,ocaml,ocamlbuild,Compilation,Ocaml,Ocamlbuild,我最近决定在我的项目目录中组织文件。我将几个不同文件类型的解析器移到了它们自己的目录中,并决定使用ocamlbuild(随着项目变得越来越复杂,简单的shell脚本不再足够) 通过使用一些基本规则(调用ocaml_lib,我将在其他时间使用ocamlfind)修改myocamlbuild,我能够成功地包含外部项目,但我仍然无法正确地将文件夹作为模块包含到项目中。我创建了一个parser.mlpack文件,并用要包含的适当模块(例如,“parser/Date”,等等)填充它,在目录的根目录中为它们
ocaml_lib
,我将在其他时间使用ocamlfind)修改myocamlbuild,我能够成功地包含外部项目,但我仍然无法正确地将文件夹作为模块包含到项目中。我创建了一个parser.mlpack
文件,并用要包含的适当模块(例如,“parser/Date”,等等)填充它,在目录的根目录中为它们的实现编写了一个parser.mli
,并修改了\u标记
文件(见下文)
在编译过程中,正确地遍历解析器目录,并且在\u build
目录中创建了parser.cmi
、parser.mli.depends
;以及解析器子目录中的所有*.cm[xio]
文件
我觉得我可能在做一些多余的事情,但无论如何,当我编译时,项目仍然找不到解析器模块
谢谢
\u标签
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
您会注意到,-I解析器
不包括在上面的链接阶段中;实际上,没有包含任何与解析器相关的文件
编辑:从下面的注释和答案中添加新的详细信息。您需要在搜索路径中“包括”解析器目录。您可以在标签中执行此操作:
"parser": include
然后,
ocamlbuild
可以在解析器目录中搜索感兴趣的文件。我想知道parser.mli
是否以某种方式干扰了处理mlpack文件时的依赖关系<处理和编译parser.mlpack
时,将从pack操作生成code>parser.cmi。尝试在删除parser.mli
文件的情况下构建。如果这是可行的,那么这可以被重新处理成一个真正的答案
另外,如果parser.mlpack
位于parser
目录中,并且您有include
标记集,则不需要将parser/
作为parser.mlpack
中模块的前缀。但这不应该对这件事产生影响
更新:这解决了问题,但不是根本原因。根据下面的评论,根本原因是
.mlpack
中提到的一个已重新定位的文件。。。。我修改了上面的问题。这很有帮助,但实际上我已经这样做了,但是从命令行与-I parser
的等价性来看。现在,我只是使用ocamlbuild项目进行构建。
那么让我们试试其他方法:)。作为一个单独的答案完成,因为它实际上是另一种方法。(为了完整起见,您可能已经知道这一点)或“解析器”将起作用,但“解析器”是正确的,因为我不尝试进行任何模式匹配。是的,这起作用,但没有预期的后果。未创建表示目录内容的模块;子模块直接引用它们。编译期间,-pack
参数被添加到适当的模块中。但不用于最终产品。我对-pack的解释是否不正确?-pack
应该创建一个模块,其中包含作为子模块的其他模块。然后,您的其他代码必须将它们作为子模块引用(例如,Parser.ConfParser
);如果它曾经直接引用它们(只是ConfParser
而不首先open
ingParser
),那么事情就会变得一团糟。当您没有parser.mli时,您可以发布-verbose
输出吗?我重新添加了parser.mli文件。我认为由于某种原因,在编译包时出现了一个错误,但它并没有在应该发生的地方中断。在我移动的mlpack
文件中有一个额外的模块。
"parser": include