使用Dune编译含fmt、logs包的OCaml项目时遇模块实现缺失错误
解决Dune编译OCaml项目时缺失Fmt_cli/Logs_fmt等模块的问题
在使用Dune编译依赖fmt(0.9.0版本)和logs的OCaml项目时,出现以下链接错误:
File "_none_", line 1: Error: No implementations provided for the following modules: Fmt_cli referenced from bin/.main.eobjs/native/dune__exe__Main.cmx Logs_fmt referenced from bin/.main.eobjs/native/dune__exe__Main.cmx Fmt_tty referenced from bin/.main.eobjs/native/dune__exe__Main.cmx Logs_cli referenced from bin/.main.eobjs/native/dune__exe__Main.cmx
即便已确认opam switch中安装了fmt和logs库,且Dune配置里添加了fmt和logs依赖,问题仍存在。
问题原因
fmt 0.9.0版本将Fmt_cli、Fmt_tty这类模块拆分到了子库中,并非包含在主fmt库内;同理,logs库的Logs_fmt、Logs_cli也分别属于独立的子库,仅依赖主库无法链接到这些模块。
解决方法
修改项目中对应Dune文件的libraries配置,添加所需的子库依赖:
- 对于fmt的子模块,添加
fmt.cli - 对于logs的子模块,添加
logs.fmt和logs.cli
修改后的Dune配置示例:
(executable (name main) (libraries fmt fmt.cli logs logs.fmt logs.cli))
修改完成后重新执行dune build,链接错误即可解决。
内容的提问来源于stack exchange,提问作者tbrugere
相关产品推荐
相关产品推荐

