ocamlmklib to the rescue. Step by step:
$ 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
Oops, you defined caml_silly_silly in sillystubs.c but you refer to silly_silly in silly.mli (so stupid :) Repairing:
$ 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
Still out of luck? Add -I. to find the required libraries.
$ 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
But in the โrealโ setup, you really want to install the stupid library with ocamlfind, and then compile with ocamlfind, add the necessary command line parameters and everything will work automatically. Starting from scratch, the whole procedure is as follows:
$ 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
Ready source and byte versions. BTW ocamlc -custom out of date .
The mystery presented, I hope.
ygrek source share