执行Makefile编译OCaml项目提示Prettyprint模块不可用是什么原因
报错含义说明
你遇到的Error: Required module 'Prettyprint' is unavailable是OCaml链接阶段的报错,含义是:链接器在生成最终可执行文件时,找不到Prettyprint模块对应的已编译字节码文件(.cmo后缀),无法完成模块符号的关联。
问题根因
查看你提供的Makefile可直接定位问题:你只在链接命令里写了Prettyprint.cmo,但前面的编译步骤完全没有对Prettyprint.ml执行编译操作,Prettyprint.cmo文件根本不存在,自然无法被链接器找到。
同时你也漏了StaticSemantics.ml的编译步骤,修复Prettyprint的问题后还会触发StaticSemantics模块不存在的同类报错。
另外需要注意OCaml链接对模块顺序有要求:被其他模块依赖的模块,对应的.cmo必须放在依赖它的模块之前,顺序错误也可能触发同类报错。
修复方案
调整后的Makefile参考如下:
@echo "# Lexer & Parser:" ocamlc -g -c parser.mli lexer.ml parser.ml @echo "# 编译业务模块" # 按依赖顺序编译所有.ml文件,有.mli的需要先编译.mli ocamlc -g -c AbstractSyntax.ml Prettyprint.ml StaticSemantics.ml TransitionalSemantics.ml @echo "# 链接生成可执行文件" ocamlc -g -o main str.cma AbstractSyntax.cmo Prettyprint.cmo StaticSemantics.cmo TransitionalSemantics.cmo lexer.cmo parser.cmo
如果你的模块存在对应的.mli接口定义文件,需要先编译.mli生成.cmi文件,再编译对应的.ml文件。
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

