Compiler errors OCaml警告31、编译器库和ppx

Compiler errors OCaml警告31、编译器库和ppx,compiler-errors,ocaml,warnings,ocamlbuild,ocamllex,Compiler Errors,Ocaml,Warnings,Ocamlbuild,Ocamllex,我正在将我的应用程序从OCAML4.02.3移植到4.03.0 假设您在lexer.ml中有以下内容: type t = T [@@deriving sexp] let () = sexp_of_t |> ignore; print_endline "hai" 我尝试按以下方式运行它: ocamlbuild -use-ocamlfind -pkg ppx_sexp_conv -cflags '-w @a-4-31' lexer.byte -- 但我得到了以下错误: Warni

我正在将我的应用程序从OCAML4.02.3移植到4.03.0

假设您在
lexer.ml中有以下内容:

type t = T [@@deriving sexp]

let () =
  sexp_of_t |> ignore;
  print_endline "hai"
我尝试按以下方式运行它:

ocamlbuild -use-ocamlfind -pkg ppx_sexp_conv -cflags '-w @a-4-31' lexer.byte --
但我得到了以下错误:

Warning 31: files lexer.cmo and /Users/vladimir/.opam/4.03.0+flambda/lib/ocaml/compiler-libs/ocamlcommon.cma(Lexer) both define a module named Lexer
File "_none_", line 1:
Error: Some fatal warnings were triggered (1 occurrences)
我知道
编译器libs
也有一个名为
Lexer
的模块,它与我的Lexer冲突,但是:

  • 我不想链接编译器库。我知道它被
    ppx\u sexp\u conv
    使用,但它是一个预处理器,不需要将编译器库链接到我的应用程序中

  • 警告31只是一个警告,我明确地试图将其作为一种解决方法(w@a-4-31)排除,但这不起作用。它曾在4.02.3中起作用


此警告31错误是ocaml 4.03.0编译器的新默认行为

当链接同名的两个模块时,OCaml会给出警告31。这不是特定于4.03.0:

$ touch a.ml
$ ocamlc a.ml a.ml
File "a.cmo", line 1:
Warning 31: files a.cmo and a.cmo both define a module named A
File "a.ml", line 1:
Error: Some fatal warnings were triggered (1 occurrences)  <-- This is new in 4.03.0
$touch a.ml
$ocamlc a.ml a.ml
文件“a.cmo”,第1行:
警告31:a.cmo和a.cmo文件都定义了名为a的模块
文件“a.ml”,第1行:

错误:触发了一些致命警告(出现1次)。这似乎是一个ocamlbuild错误。你们试过向他们报告吗?关于链接问题:我还发现使用ppx重写器会导致链接大量内容。为了克服这个问题,我通过
\u标记
文件使用了单独的编译和链接阶段:
:package(ppx\u jsobject\u conv)
“src/core.byte”:package(ppx\u jsobject\u conv.runtime)
@PatJ,不,这不是ocamlbuild错误。非常感谢。这就是为什么
-w@a-4-31
没有帮助的原因,尽管我想说,31是一个不能正常禁用的特殊警告,这是很糟糕的可用性。然而,我仍然试图从一开始就避免链接到编译器库。实际上,
-warn error-a
解决方案似乎不起作用。我使用以下命令得到了相同的错误:
ocamlbuild-use ocamlfind-pkg ppx\u sexp\u conv-cflags'-w@a-4-31-warn error-a'lexer.byte--
用于上面的
lexer.ml
。Warning 31用于链接。使用
-lflags'-warn error-a'
代替
-cflags
。(这就是我不使用ocamlbuild的原因。太多的东西隐藏在它的引擎盖下。通常情况下,这是可以的,但一旦遇到麻烦,你就真的完蛋了。)
$ ocamlc -v
The OCaml compiler, version 4.03.0
Standard library directory: /Users/XXX/.opam/4.03.0/lib/ocaml
$ ocamlc -help
...
  -warn-error <list>  Enable or disable error status for warnings according
     to <list>.  See option -w for the syntax of <list>.
     Default setting is "-a+31"