首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法使用OCAML中其他文件中的函数

无法使用OCAML中其他文件中的函数
EN

Stack Overflow用户
提问于 2017-05-16 11:06:46
回答 2查看 450关注 0票数 0

首先,我使用下面的makefile编译(我不知道它是否重要,但因为我用它编译.):

代码语言:javascript
复制
NAME =  project


ML =    project.ml \
        main.ml


MLI =   project.mli


CMI = $(MLI:.mli=.cmi)
CMO = $(ML:.ml=.cmo)
CMX = $(ML:.ml=.cmx)


OCAMLDPE = ocamldep
CAMLFLAGS = -w Aelz -warn-error A
OCAMLC = ocamlc $(CAMLFLAGS)
OCAMLOPT = ocamlopt $(CAMLFLAGS)
OCAMLDOC = ocamldoc -html -d $(ROOT)/doc


all:        .depend $(CMI) $(NAME)

byte:       .depend $(CMI) $(NAME).byte


$(NAME):    $(CMX)
        @$(OCAMLOPT) -o $@ str.cmxa $(CMX)
        @echo "[OK] $(NAME) linked"

$(NAME).byte:   $(CMO)
        @$(OCAMLC) -o $@ str.cma $(CMO)
        @echo "[OK] $(NAME).byte linked"

%.cmx:      %.ml
        @$(OCAMLOPT) -c $<
        @echo "[OK] [$<] builded"

%.cmo:      %.ml
        @$(OCAMLC) -c $<
        @echo "[OK] [$<] builded"

%.cmi:      %.mli
        @$(OCAMLC) -c $<
        @echo "[OK] [$<] builded"

documentation:  $(CMI)
        @$(OCAMLDOC) $(MLI)
        @echo "[OK] Documentation"


re:     fclean all


clean:
        @/bin/rm -f *.cm* *.o .depend *~
        @echo "[OK] clean"


fclean:     clean
        @/bin/rm -f $(NAME) $(NAME).byte
        @echo "[OK] fclean"


.depend:
        @/bin/rm -f .depend
        @$(OCAMLDPE) $(MLI) $(ML) > .depend
        @echo "[OK] dependencies"

我有3个文件,我的main.ml、一个project.ml和一个project.mli --在main.ml中有一个简单的函数yolo:

代码语言:javascript
复制
let yolo lol = 
    print_string(lol)
;;

但当我试图在我的project.ml中这样称呼它时:

代码语言:javascript
复制
Main.yolo "lol";

我只是有一个错误,说模块Main没有绑定:

代码语言:javascript
复制
[OK] [project.mli] builded
File "project.ml", line 34, characters 1-10:
Error: Unbound module Main
make: *** [project.cmx] Erreur 2

这里还有project.ml的内容(project.mli是空的):

代码语言:javascript
复制
let rec project l =
    Main.yolo l;
;;

Random.self_init ();;

let _ = project [] ;;

在搜索堆叠溢出的问题时,我发现很多人都有同样的问题.因为他们在使用#use,但这不是我的情况。

作为初学者,如果你能解释的话,那就太棒了:)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-05-16 11:51:02

在Makefile中,模块的ML列表应该按照拓扑顺序排序,也就是说,模块应该在所有依赖项之后指定。在您的示例中,Makefile的头应该如下所示:

代码语言:javascript
复制
NAME =  project

ML =    main.ml \
        project.ml

最后但并非最不重要的一点是,我强烈建议您不要使用Makefiles来编译OCaml程序,除非您真正了解自己在做什么以及底层OCaml工具链是如何操作的。小型项目使用ocamlbuild,大型项目使用oasis。在您的情况下,您不需要任何特定的东西来构建您的项目,只需做

代码语言:javascript
复制
ocamlbuild project.native

你会得到二进制数。它还将使您的工作目录保持干净(如果已经很脏,它将帮助您对其进行消毒)。

票数 6
EN

Stack Overflow用户

发布于 2017-05-16 11:42:33

您有计算依赖项的代码,但不包括它们。因此,Project是在尚未构建Main时生成的。

Makefile的末尾添加以下行可以修复它:

代码语言:javascript
复制
-include .depend

尽管如此,我建议不要使用make,并使用像ocamlbuild这样的构建工具。没有任何设置,您就可以运行ocamlbuild project.byte并具有同等的功能。

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

https://stackoverflow.com/questions/43999762

复制
相关文章

相似问题

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