ocamlfind жалуется, что не реализована реализация модулей, установленных через opam

Я возился с FFI OCaml, чтобы попытаться выяснить, как происходит вывод ширины перечисления C (который, я думаю, определяется реализацией для C), и я пытаюсь вставить тип неправильной ширины, чтобы увидеть, какие удары во время выполнения. Это мотивация, но реальная проблема, с которой я столкнулся, гораздо более приземленная.

У меня есть простой файл 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 ();;

Я настроил опам и установил 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;;

1 ответ

Решение

Мне кажется, что вы забыли добавить -linkpkg Опция ocamlfind указывает компилятору фактически связывать библиотеки из пакетов для создания исполняемого файла.

Другие вопросы по тегам