Re: [Caml-list] static C library of wrappers: compilation issues

2012-04-26 Thread Xavier ALLAMIGEON

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

2012-04-26 Thread Alain Frisch

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

2012-04-26 Thread Xavier ALLAMIGEON

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

2012-04-26 Thread Török Edwin
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