首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Merlin抱怨同一项目中缺少一个模块

Merlin抱怨同一项目中缺少一个模块
EN

Stack Overflow用户
提问于 2015-07-19 17:16:30
回答 3查看 5.1K关注 0票数 12

我是Ocaml的新手,刚刚使用emacs、merlin和flycheck设置我的开发环境。除了一件事: merlin似乎不能识别同一项目中模块之间的依赖关系,一切都或多或少都在意料之中。

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

下面是引用第二个模块awesome.ml的main.ml

代码语言:javascript
复制
(* 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:

代码语言:javascript
复制
(* awesome.ml *) 
type t = int
let one_t = 1
let succ i = i + 1
let str_of_t = string_of_int

当我用utop-eval-buffer函数将main.ml缓冲区发送到utop中求值时,我得到了一个错误:“错误:未绑定的模块很棒”

我在项目的根目录下有.merlin,它有S指令。我知道它是被merlin发现的,因为它不会抱怨"open Core“

代码语言:javascript
复制
S src
PKG core lwt ounit
B _build/src
B +threads

这是我的_tags:

代码语言:javascript
复制
<src/**>: include
<src/**>: package(oUnit), package(core)
true:thread

使用ocamlbuild的常规项目编译工作正常,没有错误。这是Makefile

代码语言:javascript
复制
## Makefile
default: main
main: main.native

test: test.native

%.native:
   ocamlbuild -use-ocamlfind $@
   mv $@ $*

.PHONY: test default

你知道为什么在utop中Awesome模块不被识别,或者这是预期行为吗?

EN

回答 3

Stack Overflow用户

发布于 2015-07-19 22:23:47

一旦你编译了其他模块(实际上,一旦你编译了它的接口),Merlin就会看到它们。因此,如果您的.merlin是正确的,那么在您运行编译之后,它将看到所有内容。基于您的.merlin文件,您的文件确实应该位于src文件夹中,即您的项目布局,应该如下所示:

代码语言:javascript
复制
Makefile
.merlin
src/
   awesome.ml
   main.ml

这不是必需的布局,但这就是您向Merlin描述的布局。我怀疑它不一样的原因是你的Makefile

附注:作为附注,您的代码中有一个小问题:您应该打开Core.Std而不是Core

票数 13
EN

Stack Overflow用户

发布于 2015-10-22 02:04:15

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

代码语言:javascript
复制
ocamlbuild foo.cmi
票数 2
EN

Stack Overflow用户

发布于 2016-08-19 20:50:38

我也有同样的问题。我尝试通过opam或sources安装merlin,但我无法解决这个问题,直到我将".merlin“文件放到\src目录中--而不是根目录--并在其中添加了"REC”标记。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31499687

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档