2015-07-19 92 views
6

我是Ocaml的新手,刚刚用emacs,merlin和flycheck设置了我的开发环境。除了一件事情之外,一切都会或多或少地发挥作用:merlin似乎无法识别同一项目中模块之间的依赖关系。Merlin抱怨同一个项目中缺少一个模块

例如我有两个模块的测试项目:main.ml和awesome.ml。

这里是我的main.ml它引用的第二模块awesome.ml

(* main.ml *) 
open Core 
module A = Awesome 
let _ = 
    Printf.printf "hello \n Converted to string we get: %s\n" 
    (A.str_of_t (A.succ A.one_t)); 

这里是awesome.ml:

(* awesome.ml *) 
type t = int 
let one_t = 1 
let succ i = i + 1 
let str_of_t = string_of_int 

当我发送main.ml缓冲,以评估为UTOP与utop-eval-buffer函数,我得到一个错误:“Error:Unbound module Awesome”

我有.merlin在有S指令的项目的根目录下。 我知道它是由梅林发现,因为它不抱怨“开核”

S src 
PKG core lwt ounit 
B _build/src 
B +threads 

这里是我的_tags:

<src/**>: include 
<src/**>: package(oUnit), package(core) 
true:thread 

与ocamlbuild经常项目编制工作正常,没有错误。 这里是Makefile中

## Makefile 
default: main 
main: main.native 

test: test.native 

%.native: 
    ocamlbuild -use-ocamlfind [email protected] 
    mv [email protected] $* 

.PHONY: test default 

为什么真棒模块没有UTOP承认或这是预期的行为的任何想法?

+4

不,我不知道;我不抱怨 – Merlin

回答

10

Merlin在编译完成后会看到其他模块(事实上,一旦编译了它的接口)。所以考虑到你的.merlin是正确的,它会看到你运行编译后的一切。您的文件确实应该在一个src文件夹,也就是你的项目布局,根据你的.merlin文件应该是这样的:

Makefile 
.merlin 
src/ 
    awesome.ml 
    main.ml 

这不是必需的布局,但这是一个,你描述梅林。原因,为什么我怀疑它不一样,是你的Makefile

P.S.正如旁注所示,代码中存在一个小问题:您应该打开Core.Std而不是Core

+0

谢谢伊万。它仍然不起作用。我有一个正确的项目布局 - 源代码位于src目录中,.merlin位于项目的根目录中。 B +线程指令的原因在这里:https://github.com/the-lambda-church/merlin,我加入了merlin文档中的建议。你对开放Core.Std是正确的。我运行了编译 - 源代码编译正确,我在_build/src中看到了o个文件,但merlin仍然无法识别awesome.ml模块。看起来我的设置有问题 - 我会继续挖掘。谢谢! –

+0

我怀疑你的makefile有问题,但它不能编译任何东西。因此,如果没有'Makefile'文件,如果我只要到项目的顶层目录并发出'ocamlbuild src/main.native',那么merlin就会识别出'Awesome'模块。基本上,你'Makefile'对我来说看起来不正确。它只是不编译任何东西。一个好的检查:运行构建后应该有'_build/src/awesome.cmi'文件。 – ivg

+0

nope,makefile是很好的 - 它编译,产生一个二进制主,我可以执行。 awesome.cmi/awesome.cmo/awesome.cmt/awesome.cmti/awesome.cmxare在_build/src中生成 –

1

正如Ivan's answer所指出的那样,Merlin在编译之后只能识别项目中的模块。如果梅林是给你一个unbound module Foo错误,一个解决方案是运行

ocamlbuild foo.cmi 
+0

这实际上完全解决了它,我不知道为什么。 ocamlbuild以某种方式保存状态?我很新,所以完全有可能我只是不知道整个开发环境的工作原理。^ – Jay

+0

Ocamlbuild会将“foo.cmi”接口文件保存在“_build”目录中。我猜想我认为这是“保存状态”。 – hugomg

+0

哦,这很有道理。我认为Merlin正在看第二个,我猜想没有构建文件。猜猜我错了! – Jay

0

我有同样的问题。我尝试通过opam或源代码安装merlin,但直到我将“.merlin”文件放入\ src目录中(而不是在根目录中),并在其中带有“REC”标记时才能解决此问题。

相关问题