Ich war mit der OCaml FFI herumspielen versucht, um herauszufinden, wie es geht über die Breite eines C enum (was ich denke, ist die Implementierung für C definiert) und bin versuchen, einen Typ der falschen Breite einzufügen, um zu sehen, was zur Laufzeit explodiert. Das ist die Motivation, aber das eigentliche Problem, dem ich begegnet bin, ist viel alltäglicher.ocamlfind beschwert sich keine Implementierung für Module durch Opam
Ich habe eine einfache OCaml-Datei, die das C FFI verwendet, um eine triviale Funktion in example.c
aufzurufen, die ein enum in ein int konvertiert.
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();;
I konfiguriert OPAM und installiert Ctypes
und 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
Die beiden üblichen Beschwörungen ich für die Erstellung eines einfachen .ml
Skript verwenden, haben mich beide ausgefallen und ich bin aus Ideen. ocamlfind
und corebuild
(was ich denke, ist ein Wrapper oben auf ocamlbuild
)
ocamlfind nicht zu finden ctypes
und foreign
scheinen kann. Es beklagt sich jedoch nicht darüber, nicht in der Lage, die Pakete zu lokalisieren, so dass ich denke ctypes
und ctypes.foreign
sind die richtigen Namen für diese Pakete in der seltsamen findlib
Namespace.
% 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
Warum kann ocamlfind
diese Module nicht finden? Ich habe kein Problem, sie in den Toplevel zu laden.
─(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;;