4

私はocamlfind、CライブラリとそのCライブラリを使用してOCaml実行可能ファイルをコンパイルするために使用する方法を理解しようとしています。

かなりばかげたサンプルファイルのセットをまとめました。

% 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ツールは私にはやや不思議なので、どんなポインタでも大歓迎です。

4

3 に答える 3

7

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

おっと、あなたはsillystubs.cでcaml_silly_sillyを定義しましたが、silly.mliでsilly_sillyを参照しています(非常に愚かです:)修復:

$ 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

しかし、「実際の」セットアップでは、実際に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非推奨です

謎が解き明かされたと思います。

于 2010-05-11T08:29:56.820 に答える
1

OCamlツールは私にはやや不思議ですが、

私もそう思います。おまけを使ってみませんか?omakeはビルドシーケンスをシンプルにします。 http://omake.metaprl.org/manual/omake-build.html#@fun272

于 2010-05-10T23:22:12.000 に答える
1

私はOCamlのバージョンが遅れていますが、動的にリンクされsilly.cmaているように見えるので、sillystubs

-ccopt -L${PWD} 

その最後の行に。

また、あなたがしていることで、の追加の力を必要とするものは何もocamlfind見当たりませんocamlc。直接電話する方がよいでしょう。

于 2010-05-11T00:31:24.527 に答える