ocamlfind 抱怨没有为通过 opam 安装的模块提供实现
ocamlfind complains no implementation provided for modules installed through opam
我正在研究 OCaml FFI 以试图弄清楚它是如何推断 C 枚举的宽度(我认为这是为 C 实现定义的)并试图插入一个错误的类型width 以查看在运行时发生了什么。这就是动机,但我 运行 涉及的实际问题要平凡得多。
我有一个简单的 OCaml 文件,它使用 C FFI 调用 example.c
中的一个简单函数,将枚举转换为 int。
open Printf;;
let (@->) = Ctypes.(@->);;
let returning = Ctypes.returning;;
let foreign = Foreign.foreign;;
(* deliberately use the wrong scalar type for argument *)
let wrong_int64_of_color =
foreign "int_of_color" (Ctypes.int64_t @-> returning Ctypes.int64_t);;
let main () =
printf "%Ld\n" (wrong_int64_of_color (Int64.of_int 100));;
let () = main ();;
我配置了 opam 并安装了 Ctypes
和 Ctypes.Foreign
% opam config env | sed -e 's/=.*/=/'
CAML_LD_LIBRARY_PATH=
OPAMUTF8MSGS=
MANPATH=
PERL5LIB=
OCAML_TOPLEVEL_PATH=
PATH=
% opam list | grep ctypes
ctypes 0.6.2 Combinators for binding to C libraries withou
ctypes-foreign 0.4.0 Virtual package for enabling the ctypes.forei
我用来编译一个简单的 .ml
脚本的两个常用咒语都让我失败了,而且我没有想法。 ocamlfind
和 corebuild
(我认为这是 ocamlbuild
之上的包装)
ocamlfind 似乎找不到 ctypes
和 foreign
。但是,它并没有抱怨无法找到包,所以我猜测 ctypes
和 ctypes.foreign
是奇怪的 findlib
命名空间中这些包的正确名称。
% ocamlfind ocamlopt -package findlib,ctypes,ctypes.foreign -thread call_example.ml
File "_none_", line 1:
Warning 58: no cmx file was found in path for module Foreign, and its interface was not compiled with -opaque
File "call_example.ml", line 1:
Error: No implementations provided for the following modules:
Ctypes referenced from call_example.cmx
Foreign referenced from call_example.cmx
为什么 ocamlfind
找不到这些模块?将它们加载到顶层没有问题。
─( 22:30:42 )─< command 0
utop # #require "ctypes";;
─( 22:30:42 )─< command 1
utop # open Ctypes;;
─( 22:30:55 )─< command 2
utop # #require "ctypes.foreign";;
─( 22:31:00 )─< command 3
utop # open Ctypes;;
在我看来,您忘记添加 -linkpkg
ocamlfind 选项来指示编译器实际上 link 包中的库来构建可执行文件。
我正在研究 OCaml FFI 以试图弄清楚它是如何推断 C 枚举的宽度(我认为这是为 C 实现定义的)并试图插入一个错误的类型width 以查看在运行时发生了什么。这就是动机,但我 运行 涉及的实际问题要平凡得多。
我有一个简单的 OCaml 文件,它使用 C FFI 调用 example.c
中的一个简单函数,将枚举转换为 int。
open Printf;;
let (@->) = Ctypes.(@->);;
let returning = Ctypes.returning;;
let foreign = Foreign.foreign;;
(* deliberately use the wrong scalar type for argument *)
let wrong_int64_of_color =
foreign "int_of_color" (Ctypes.int64_t @-> returning Ctypes.int64_t);;
let main () =
printf "%Ld\n" (wrong_int64_of_color (Int64.of_int 100));;
let () = main ();;
我配置了 opam 并安装了 Ctypes
和 Ctypes.Foreign
% opam config env | sed -e 's/=.*/=/'
CAML_LD_LIBRARY_PATH=
OPAMUTF8MSGS=
MANPATH=
PERL5LIB=
OCAML_TOPLEVEL_PATH=
PATH=
% opam list | grep ctypes
ctypes 0.6.2 Combinators for binding to C libraries withou
ctypes-foreign 0.4.0 Virtual package for enabling the ctypes.forei
我用来编译一个简单的 .ml
脚本的两个常用咒语都让我失败了,而且我没有想法。 ocamlfind
和 corebuild
(我认为这是 ocamlbuild
之上的包装)
ocamlfind 似乎找不到 ctypes
和 foreign
。但是,它并没有抱怨无法找到包,所以我猜测 ctypes
和 ctypes.foreign
是奇怪的 findlib
命名空间中这些包的正确名称。
% ocamlfind ocamlopt -package findlib,ctypes,ctypes.foreign -thread call_example.ml
File "_none_", line 1:
Warning 58: no cmx file was found in path for module Foreign, and its interface was not compiled with -opaque
File "call_example.ml", line 1:
Error: No implementations provided for the following modules:
Ctypes referenced from call_example.cmx
Foreign referenced from call_example.cmx
为什么 ocamlfind
找不到这些模块?将它们加载到顶层没有问题。
─( 22:30:42 )─< command 0
utop # #require "ctypes";;
─( 22:30:42 )─< command 1
utop # open Ctypes;;
─( 22:30:55 )─< command 2
utop # #require "ctypes.foreign";;
─( 22:31:00 )─< command 3
utop # open Ctypes;;
在我看来,您忘记添加 -linkpkg
ocamlfind 选项来指示编译器实际上 link 包中的库来构建可执行文件。