[
Home
]
[ Index:
by date
|
by threads
]
[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
| Date: | -- (:) |
| From: | rouanvd@s... |
| Subject: | problem creating .cma library |
Hi everyone.
I am trying to create an ocaml binding to a C library as a test to see if I
can get the ocaml FFI to work. This is just experimental so I can gain
experience to later write bindings to real C libraries for ocaml.
I am using ocaml 3.11.0 with the MingW toolchain on windows (vista).
I first create a dll called libmylib.dll which contains 1 method called:
void my_print(char* str);
The DLL is created with the MingW toolchan and works correctly as I create
a test C application that links against libmylib.dll and executes correctly.
the library is created with the following gcc commands:
gcc -fPIC -Wall -c mylib.c
gcc -shared -o libmylib.dll mylib.o
Now I create the mylib_stub.c file which contains the marshalling code
between the libmylib.dll library and ocaml. This file contains the
following C code:
=======================================
#include <stdio.h>
#include <caml/mlvalues.h>
#include "../mylib/mylib.h"
CAMLprim value
my_print_stub(value v) {
char* str = (char*)String_val( v );
my_print( str );
return Val_unit;
}
=======================================
I then create the mylib.ml file which contains the following ocaml code:
=======================================
external my_print : string -> unit = "my_print_stub"
=======================================
I then use the following commands to create a .cma file that is supposed
to expose the my_print function in the libmylib.dll to ocaml:
ocamlc -c mylib.ml
ocamlc -c mylib_stub.c
ocamlmklib -o _stubs mylib_stub.o -L/mingw/lib -L. -lmylib
ocamlc -a -o mylib.cma mylib.cmo -dllib -l_stubs -ccopt -L. -cclib -lmylib
Up to this point, there are no errors.
When I finaly build the test ocaml app which is supposed to use the
mylib.cma library, ocamlc tells me:
"Unbound module Mylib"
The command used to compile the test app is
ocamlc -verbose mylib.cma -c Main.ml
The Main.ml file contains the following code:
=======================================
open Mylib
let main () =
my_print "my_print = ok"
main ()
=======================================
Is there a way to verify that the .cma library was created correctly?
I had to install flexlink for ocaml to get the dll linking to work on
windows.
Kind regards
Rouan.