2016-08-15 3 views
0

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;; 

Antwort

4

Es scheint mir, dass Sie -linkpkg ocamlfind Option hinzuzufügen vergessen zu instruieren, verbinden den Compiler tatsächlich die Bibliotheken aus den Paketen die ausführbare Datei zu erstellen.

Verwandte Themen