如何使用 ocamlbuild 工具编译需要cryptokit 包(使用配套 ocaml 成功编译)的 jocaml 源文件?
当我执行命令时,ocamlbuild -pkg cryptokit -use-jocaml a.native
我收到此错误:
Warning: tag "package" does not expect a parameter, but is used with parameter "cryptokit"¬
+ jocamlopt -I /prefix/lib/ocaml -I /prefix/lib/ocaml/site-lib/cryptokit -I /prefix/lib/ocaml/site-lib/num /prefix/lib/ocaml/unix.cmxa /prefix/lib/ocaml/nums.cmxa /prefix/lib/ocaml/site-lib/cryptokit/cryptokit.cmxa a.cmx -o a.native¬
File "_none_", line 1:¬
Error: Files /prefix/lib/ocaml/unix.cmxa¬
and /prefix/lib/ocaml/unix.cmxa¬
both define a module named Unix¬
Command exited with code 2.¬
Compilation unsuccessful after building 4 targets (3 cached) in 00:00:00.
本质上,ocaml Unix 模块与自己发生冲突。仅当我包含 Cryptokit (with -pkg cryptokit
) 时才会出现此错误,这可能是因为 Cryptokit 需要 Unix。a.ml
实际上可以是空的并且仍然会重现错误。
我尝试添加-use-ocamlfind
标志,但由于它也使用 ocamlfind 来获取编译器,因此它选择 ocaml 编译器而不是 jocaml 编译器。
-verbose 1
通过按顺序执行与 ocamlbuild 相同的命令(/.../unix.cmxa
由当我在以下位置使用任何 jocaml 功能时,它会完全崩溃a.ml
:
jocamlopt -I /prefix/lib/ocaml -I /prefix/lib/ocaml/site-lib/cryptokit -I /prefix/lib/ocaml/site-lib/num /prefix/lib/ocaml/nums.cmxa /prefix/lib/ocaml/site-lib/cryptokit/cryptokit.cmxa a.cmx -o a.native
但是,当我也删除该-I /prefix/lib/ocaml
部分时,它会成功编译:
jocamlopt -I /prefix/lib/ocaml/site-lib/cryptokit -I /prefix/lib/ocaml/site-lib/num /prefix/lib/ocaml/nums.cmxa /prefix/lib/ocaml/site-lib/cryptokit/cryptokit.cmxa a.cmx -o a.native
总而言之,我通过手动执行最后一个命令的修改来让它工作,但我想让 ocamlbuild 工作。
我认为这个错误与 Cryptokit 需要 Unix 模块这一事实有关:当我用 ocaml 而不是 jocaml 编译它时,在链接阶段它试图与 ocaml stdlib 链接(需要包含)而不是jocaml 标准库之一(作为标准库的一部分隐式包含)。