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