Re: [Caml-list] static C library of wrappers: compilation issues
Le 26/04/12 14:23, Alain Frisch a écrit : On 04/26/2012 12:08 PM, Xavier ALLAMIGEON wrote: What do you mean exactly? I imagine that test.o needs some functions of the libhello_world.a. But I don't see why libasmrun would need some other functions of libhello_world... Well, this is the case. libasmrun contains the runtime system for OCaml code (compiled with ocamlopt) and, as you can see in the error message from the linker, it depends on symbols provided by the OCaml program. For instance, the garbage collector (in libasmrum) needs to find special symbols, to locate some data structures (in libhello_world.a) created by the compiler. Ok, now I understand, thanks a lot for your explanation. Best regards. Xavier -- Caml-list mailing list. Subscription management and archives: https://sympa-roc.inria.fr/wws/info/caml-list Beginner's list: http://groups.yahoo.com/group/ocaml_beginners Bug reports: http://caml.inria.fr/bin/caml-bugs
Re: [Caml-list] static C library of wrappers: compilation issues
On 04/26/2012 12:08 PM, Xavier ALLAMIGEON wrote: What do you mean exactly? I imagine that test.o needs some functions of the libhello_world.a. But I don't see why libasmrun would need some other functions of libhello_world... Well, this is the case. libasmrun contains the runtime system for OCaml code (compiled with ocamlopt) and, as you can see in the error message from the linker, it depends on symbols provided by the OCaml program. For instance, the garbage collector (in libasmrum) needs to find special symbols, to locate some data structures (in libhello_world.a) created by the compiler. What about the following alternative where libasmrun is directly appended to the .a file? cp "`ocamlc -where`"/libasmrun.a libhello_world.a ar rcs libhello_world.a ml_code.obj.o c_code.o gcc -o test -L. -L"`ocamlc -where`" test.c -lhello_world -lm -ldl This looks fine to me. -- Alain -- Caml-list mailing list. Subscription management and archives: https://sympa-roc.inria.fr/wws/info/caml-list Beginner's list: http://groups.yahoo.com/group/ocaml_beginners Bug reports: http://caml.inria.fr/bin/caml-bugs
Re: [Caml-list] static C library of wrappers: compilation issues
Dear Edwin, Le 26/04/12 10:33, Török Edwin a écrit : Here's the way I'm compiling everything. It builds a libhello_world.a static library from ml_code.obj.o and c_code.o. ocamlc -c ml_code.mli ocamlopt -c ml_code.ml ocamlopt -output-obj ml_code.cmx -o ml_code.obj.o gcc -c c_code.c -I"`ocamlc -where`" ar rcs libhello_world.a ml_code.obj.o c_code.o gcc -o test -L. -L"`ocamlc -where`" test.c -lhello_world -lasmrun -lm -ldl You need -Wl,--whole-archive -Wl,--no-whole-archive around the link of your .a, like this: gcc -o test -L. -L"`ocamlc -where`" test.c -Wl,--whole-archive -lhello_world -Wl,--no-whole-archive -lasmrun -lm -ldl Thanks a lot, it works now! Otherwise the functions from your .a are dropped because nothing else before it needs it (-lasmrun would, but its after your .a). What do you mean exactly? I imagine that test.o needs some functions of the libhello_world.a. But I don't see why libasmrun would need some other functions of libhello_world... What about the following alternative where libasmrun is directly appended to the .a file? cp "`ocamlc -where`"/libasmrun.a libhello_world.a ar rcs libhello_world.a ml_code.obj.o c_code.o gcc -o test -L. -L"`ocamlc -where`" test.c -lhello_world -lm -ldl Best regards. Xavier -- Caml-list mailing list. Subscription management and archives: https://sympa-roc.inria.fr/wws/info/caml-list Beginner's list: http://groups.yahoo.com/group/ocaml_beginners Bug reports: http://caml.inria.fr/bin/caml-bugs
Re: [Caml-list] static C library of wrappers: compilation issues
On 04/26/2012 10:58 AM, Xavier ALLAMIGEON wrote: > Dear caml-list, > > I'd like to build a static C library implementing an interface to an OCaml > library, but I get some compilation errors. Here's an example of the problem. > > 1) The ml_code.* files contain a hello_world function which I'd like to > provide in C. > > > let ml_hello_world () = > print_endline "Hello world!" > > let _ = > Callback.register "ml_hello_world" ml_hello_world > > > val ml_hello_world: unit -> unit > > 2) On the C part, I created .c/.h files calling the ml function with camlback: > > #include > #include > > void init(void) { > char* dummy = '\0'; > caml_main(&dummy); > } > > void c_hello_world(void) { > CAMLparam0(); > static value *closure_ml_hello_world = NULL; > if (closure_ml_hello_world == NULL) { > closure_ml_hello_world = caml_named_value("ml_hello_world"); > } > caml_callback(*closure_ml_hello_world, Val_unit); > CAMLreturn0; > } > > > void init(void); > void c_hello_world(void); > > 3) Finally, I created a test file in C: > > #include "c_code.h" > > int main(int argc, char **argv) { > init(); > c_hello_world(); > } > > Here's the way I'm compiling everything. It builds a libhello_world.a static > library from ml_code.obj.o and c_code.o. > ocamlc -c ml_code.mli > ocamlopt -c ml_code.ml > ocamlopt -output-obj ml_code.cmx -o ml_code.obj.o > gcc -c c_code.c -I"`ocamlc -where`" > ar rcs libhello_world.a ml_code.obj.o c_code.o > gcc -o test -L. -L"`ocamlc -where`" test.c -lhello_world -lasmrun -lm -ldl You need -Wl,--whole-archive -Wl,--no-whole-archive around the link of your .a, like this: gcc -o test -L. -L"`ocamlc -where`" test.c -Wl,--whole-archive -lhello_world -Wl,--no-whole-archive -lasmrun -lm -ldl Otherwise the functions from your .a are dropped because nothing else before it needs it (-lasmrun would, but its after your .a). Best regards, --Edwin -- Caml-list mailing list. Subscription management and archives: https://sympa-roc.inria.fr/wws/info/caml-list Beginner's list: http://groups.yahoo.com/group/ocaml_beginners Bug reports: http://caml.inria.fr/bin/caml-bugs