xox*_*xel 0 ocaml compilation function
首先,我使用以下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"
Run Code Online (Sandbox Code Playgroud)
我有3个文件,我的main.ml
,一个project.ml
和project.mli
一个简单的函数yolo main.ml
:
let yolo lol =
print_string(lol)
;;
Run Code Online (Sandbox Code Playgroud)
但是当我尝试用我的方式调用它时project.ml
:
Main.yolo "lol";
Run Code Online (Sandbox Code Playgroud)
我只是有一个错误,说模块Main
没有绑定:
[OK] [project.mli] builded
File "project.ml", line 34, characters 1-10:
Error: Unbound module Main
make: *** [project.cmx] Erreur 2
Run Code Online (Sandbox Code Playgroud)
这里也是project.ml
(project.mli
是空的)的内容:
let rec project l =
Main.yolo l;
;;
Random.self_init ();;
let _ = project [] ;;
Run Code Online (Sandbox Code Playgroud)
在搜索stackoverflow的已经问过的问题时,我发现很多人都有同样的问题....因为他们正在使用#use
,但这不是我的情况.
作为一个初学者,如果你能解释我会很棒:).
在Makefile中,ML
模块列表应按拓扑顺序排序,即应在所有依赖项之后指定模块.在您的情况下,Makefile的标题应如下所示:
NAME = project
ML = main.ml \
project.ml
Run Code Online (Sandbox Code Playgroud)
最后但同样重要的是,我强烈建议您不要使用Makefile来编译OCaml程序,除非您真的知道自己在做什么以及低级OCaml工具链如何运作.使用ocamlbuild
的小项目,和oasis
为大的.在您的情况下,您不需要任何特定的东西来构建您的项目,只需这样做
ocamlbuild project.native
Run Code Online (Sandbox Code Playgroud)
你会得到二进制文件.它还将使您的工作目录保持干净(如果它已经脏了,它将帮助您清理它).