Компиляция c lib и ocaml exe используют его, все с помощью ocamlfind
Вопрос
Я пытаюсь выработать, как использовать ocamlfind
Для компиляции библиотеки C и исполняемого файла OCAML с использованием этой C библиотеки.
Я собрал набор довольно глупых пример файлов.
% cat sillystubs.c
#include <stdio.h>
#include <caml/mlvalues.h>
#include <caml/memory.h>
#include <caml/alloc.h>
#include <caml/custom.h>
value
caml_silly_silly( value unit )
{
CAMLparam1( unit );
printf( "%s\n", __FILE__ );
CAMLreturn( Val_unit );
}
% cat silly.mli
external silly : unit -> unit = "silly_silly"
% cat foo.ml
open Silly
open String
let _ =
print_string "About to call into silly";
silly ();
print_string "Called into silly"
Я считаю, что следующее - это способ составить библиотеку:
% ocamlfind ocamlc -c sillystubs.c
% ar rc libsillystubs.a sillystubs.o
% ocamlfind ocamlc -c silly.mli
% ocamlfind ocamlc -a -o silly.cma -ccopt -L${PWD} -cclib -lsillystubs
Теперь я не могу использовать созданную библиотеку, хотя:
% ocamlfind ocamlc -custom -o foo foo.cmo silly.cma
/usr/bin/ld: cannot find -lsillystubs
collect2: ld returned 1 exit status
File "_none_", line 1, characters 0-1:
Error: Error while building custom runtime system
Инструменты Ocaml несколько загадочны для меня, поэтому любые указатели будут приветствовать.
Решение
ocamlmklib к спасению. Шаг за шагом:
$ ocamlc -verbose -c sillystubs.c
$ ocamlmklib -verbose sillystubs.o silly.mli -o silly
$ ocamlc -verbose silly.cma foo.ml -o foo
File "foo.ml", line 1, characters 0-1:
Error: Error while linking foo.cmo:
The external function `silly_silly' is not available
К сожалению, вы определили CAML_SILLY_SILLY в Syllystubs.C, но ссылку Silly_silly в Sylly.mli (так много глупо :) Ремонт:
$ cat silly.mli
external silly : unit -> unit = "caml_silly_silly"
$ ocamlmklib -verbose sillystubs.o silly.mli -o silly
$ ocamlc -custom -verbose silly.cma foo.ml -o foo
/usr/bin/ld: cannot find -lsilly
collect2: ld returned 1 exit status
File "foo.ml", line 1, characters 0-1:
Error: Error while building custom runtime system
Все еще не повезло? Добавлять -I.
найти необходимые библиотеки.
$ ocamlc -I . -verbose silly.cma foo.ml -o foo.byte
$ ocamlc -I . -verbose -custom silly.cma foo.ml -o foo.byte.custom
$ ocamlopt -I . -verbose silly.cmxa foo.ml -o foo.native
Но в «Real» настроек вы действительно хотите установить глупую библиотеку с ocamlfind, а затем запущенные компиляции через ocamlfind поставить необходимые параметры командной строки на месте, и все работает автоматически. Начиная с нуля всю процедуру выглядит следующим образом:
$ ocamlc -verbose -c sillystubs.c
$ ocamlmklib -verbose sillystubs.o silly.mli -o silly
$ cat META
version="0"
description="quite silly"
archive(byte)="silly.cma"
archive(native)="silly.cmxa"
$ ocamlfind install silly META silly.cm* *.mli *.a *.so
Installed /usr/local/lib/ocaml/3.11.2/silly/silly.a
Installed /usr/local/lib/ocaml/3.11.2/silly/libsilly.a
Installed /usr/local/lib/ocaml/3.11.2/silly/silly.mli
Installed /usr/local/lib/ocaml/3.11.2/silly/silly.cmxa
Installed /usr/local/lib/ocaml/3.11.2/silly/silly.cmi
Installed /usr/local/lib/ocaml/3.11.2/silly/silly.cma
Installed /usr/local/lib/ocaml/3.11.2/silly/META
Installed /usr/local/lib/ocaml/3.11.2/stublibs/dllsilly.so
Installed /usr/local/lib/ocaml/3.11.2/stublibs/dllsilly.so.owner
$ rm *.cm* *.a *.so *.o
$ ocamlfind ocamlopt -linkpkg -package silly foo.ml -o foo.native
$ ocamlfind ocamlc -custom -linkpkg -package silly foo.ml -o foo.byte.custom
$ ocamlfind ocamlc -linkpkg -package silly foo.ml -o foo.byte
Нативные и байтовые версии готовы. Кстати ocamlc -custom
является устаревший.
Тайна представила надеюсь.
Другие советы
Инструменты Ocaml несколько загадочны для меня,
Я тоже так думаю. Почему вы не используете Omake? Omake делает последовательности сборки простым.http://omake.metaprl.org/manual/oMake-build.html#@fun272.
Я версия на Ocaml, но она выглядит как silly.cma
имеет sillystubs
связанный динамично, так что вам может понадобиться
-ccopt -L${PWD}
на этой последней линии.
Кроме того, я не вижу ничего, что вы делаете, это призывает к дополнительной силе ocamlfind
-Вы можете также звонить ocamlc
напрямую.