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

时间:2017-05-16 11:06:47

标签: function compilation ocaml

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

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.mlproject.mlproject.mli 我在main.ml

中有一个简单的函数yolo
let yolo lol = 
    print_string(lol)
;;

但是当我尝试在我的project.ml中调用它时:

Main.yolo "lol";

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

[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为空):

let rec project l =
    Main.yolo l;
;;

Random.self_init ();;

let _ = project [] ;;

在搜索stackoverflow已经问过的问题时,我发现很多人都有同样的问题....因为他们使用的是#use,但它并不是我的情况下。

作为一个初学者,如果你能解释我会很棒:)。

2 个答案:

答案 0 :(得分:6)

在Makefile中,ML模块列表应按拓扑顺序排序,即应在所有依赖项之后指定模块。在您的情况下,Makefile的标题应如下所示:

NAME =  project

ML =    main.ml \
        project.ml

最后但同样重要的是,我强烈建议您不要使用Makefile来编译OCaml程序,除非您真的知道自己在做什么以及低级OCaml工具链如何运作。对小项目使用ocamlbuild,对大项目使用oasis。在您的情况下,您不需要任何特定的东西来构建您的项目,只需执行

ocamlbuild project.native

你会得到二进制文件。它还会让你的工作目录保持清洁(如果它已经很脏了,它会帮助你清理它)。

答案 1 :(得分:2)

您有代码来计算依赖项,但不包含它们。因此,当Project尚未构建时,Main已构建。

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

-include .depend

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