【问题标题】:Properly compiling modules in subfolders (ocamlbuild)正确编译子文件夹中的模块 (ocamlbuild)
【发布时间】:2010-02-05 18:49:14
【问题描述】:

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

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

编译过程中,正确遍历了解析器目录,parser.cmiparser.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 不包含在上面的链接阶段;实际上没有包含任何解析器相关文件!

编辑:添加了来自 cmets 的新细节并在下面回答。

【问题讨论】:

    标签: compilation ocaml ocamlbuild


    【解决方案1】:

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

    "parser": include
    

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

    【讨论】:

    • ...我在上面修改了我的问题。这有帮助,但我实际上已经在这样做了,但是从命令行上与 -I parser 的等价性来看。现在,我只是用ocamlbuild project.&lt;target&gt; 构建
    • 让我们试试别的吧:)。作为一个单独的答案完成,因为它确实是另一种方法。
    • (为了完整起见,你可能已经知道了) 或“parser”可以工作,但“parser”是正确的,因为我没有尝试进行任何模式匹配。跨度>
    【解决方案2】:

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

    另外,如果parser.mlpackparser 目录中并且您设置了include 标签,则您不需要parser/ 作为parser.mlpack 中模块的前缀。但这不应该对此产生影响。

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

    【讨论】:

    • 是的,这有效,但没有预期的后果。未创建表示目录内容的模块;它们被子模块直接引用。 -pack 参数在编译期间被添加到正确的模块中。但未用于最终产品。我对 -pack 的解释不正确吗?
    • -pack 应该创建一个包含其他模块作为子模块的模块。然后,您的其他代码必须将它们称为它们的子模块(例如Parser.ConfParser);如果它直接引用它们(只是ConfParser 没有第一个opening Parser),那么事情就会变得一团糟。当您没有parser.mli 时,您能否发布-verbose 输出?
    • 我添加了 parser.mli 文件。我认为由于某种原因,编译包时出现错误并没有在应有的地方中断。 我的mlpack 文件中有一个额外的模块被我移动了
    猜你喜欢
    • 2012-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-06
    • 1970-01-01
    • 2018-06-21
    • 2021-09-17
    • 2019-02-01
    相关资源
    最近更新 更多