2016-08-15 5 views
0

OCaml FFI로 인해 C enum (내가 C로 정의 된 구현이라고 생각합니다)의 너비를 추정하는 방법을 알아 내려고 노력했습니다. 실행시에 불어 오는 것을보기 위해 잘못된 너비 유형을 삽입하려고 시도합니다. 그것이 동기였습니다. 그러나 제가 만난 실제 문제는 훨씬 평범한 것입니다.ocamlfind는 opam을 통해 설치된 모듈에 대해 제공된 구현을 불평합니다

저는 C FFI를 사용하여 enum을 int로 변환하는 example.c의 간단한 함수를 호출하는 간단한 OCaml 파일을 가지고 있습니다.

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를 구성하고 모두 나를 실패 CtypesCtypes.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 스크립트를 컴파일에 사용하는 두 개의 일반적인 주술을 설치하고 나는 밖으로 아이디어입니다. ocamlfindcorebuild

ocamlfind이 ctypesforeign을 찾을 수가 없어 (내 생각 ocamlbuild의 상단에 래퍼입니다). 그러나 그것은 패키지를 찾을 수 없다는 것에 대해 불평하지 않기 때문에 ctypesctypes.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은 왜 이러한 모듈을 찾을 수 없습니까? 나는 그들을 최상위에 로딩하는 데 문제가 없다. 당신이 컴파일러를 지시하는 -linkpkg 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;; 

답변

4

실제로 실행 파일을 구축하기 위해 패키지에서 라이브러리를 연결합니다.