Mailing list for all users of the OCaml language and system.
 help / color / mirror / Atom feed
From: <RABIH.ELCHAAR@sgam.com>
To: <viktor.tron.ml@gmail.com>, <caml-list@yquem.inria.fr>
Subject: RE: [Caml-list] C libs from Ocaml libs
Date: Thu, 22 Nov 2007 17:41:49 +0100	[thread overview]
Message-ID: <0172C3AE3A0E964797AF43E206C1048F0ED53C@FRCOR-EXMB06.europe.am.socgen> (raw)

[-- Attachment #1: Type: text/plain, Size: 5752 bytes --]

Hello Viktor,

I think that some libraries are missing in the link phase.

 

When a x.cmxa is generated, a x.lib is also generated. You need to pass it to the linker when you are generating a c executable or dll, even if you use the .cmxas in your output-obj, because all the relevant code is not just there.

 

I am appending the makefile of some internal code that generated a C Win32 dll.

 

Hope this helps.

 

JAVA_INC=$(JNIINCLUDES)

DIRS=-w y -w p -I +camljava -I +gsl -I +schedule -I +ocamlDM -I ../common/        

LIBS=rschedule.cmxa ocamlDMManager.cmxa jni_init.cmxa common.cmxa 

all: Engine.dll

 

install: all

            cp Engine.dll ../../bin

 

# supposes that the linker has access to the j2sdk lib

# rabih /libpath:"d:/appli/j2sdk1.4.1_05/lib" 

Engine.dll: ocamllib.obj Engine.obj

            link /nologo /dll /out:Engine.dll \

            /libpath:$(OCAML_LIB) /libpath:$(OCAML_CAMLJAVA) /libpath:$(JDKHOME)/lib \

            /libpath:$(OCAML_LIB)/schedule /libpath:$(OCAML_LIB)/ocamlDM /libpath:$(OCAML_LIB)/gsl /NODEFAULTLIB:libc \

            jvm.lib jni.lib  rschedule.lib ocamlDMManager.lib \

            Engine.obj  ocamllib.obj \

            libasmrun.lib libcamljni.lib

 

Engine.obj: Engine.h Engine.c

            cl /c $(JAVA_INC) -I$(OCAML_LIB) Engine.c

 

 

%.cmx: %.mf

            ocamlopt $(DIRS) -c -dtypes $<

 

 

ocamllib.obj:ocaml _Engine.cmx

            ocamlopt -dtypes $(DIRS) -output-obj -o ocamllib.obj  $(LIBS) $^

 

depend:

            echo -n > .depend

            ocamldep $(DIRS) ocaml_Engine.mf >.depend

 

clean:

            rm -f *.obj

            rm -f *.dll

            rm -f *.lib

            rm -f *.exp

            rm -f *.cm*

            rm -f *.h

            rm -f *~

 

include .depend

include ../Makefile.config

 

________________________________

De : caml-list-bounces@yquem.inria.fr [mailto:caml-list-bounces@yquem.inria.fr] De la part de viktor tron
Envoyé : mercredi 21 novembre 2007 19:35
À : Caml Mailing List
Objet : Re: [Caml-list] C libs from Ocaml libs

 

 

On 21/11/2007, Alain Frisch <alain@frisch.fr > wrote:

viktor tron wrote:
> This is super! how is this on MacOS, I recall one of your comment earlier (on this list?)
> that it doesn't work or something.

Everything should work fine under Mac OS X x86. For PowerPC, I believe 
that "ocamlc -output-obj -o XXX.so" should be ok but that "ocamlopt
-output-obj -o XXX.so" does not work.

> well, I tried.
> ar -rs foo_caml.o foo_stub.o
> gcc -o foo_test.native foo_test.c -L. -lchainfreq_native -L/sw/lib/ocaml 

What is the name of the library you want to produce?


sorry, let me be very explicit then:

0) 
I believed that the following 
creates the c object containing: 
(a) main ocaml implementation of foo (b) export API (c) C binding to API (d) ocaml startup code 

$ ocamlopt -output-obj -o foo_caml.o foo.cmxa foo_stub.c foo_export.ml

now I create a lib

$ ar rs libfoo.a foo_caml.o

and happy ever after. Nope.
No matter how I link it with a main c test, I get undefined symbols for startup code 

$ gcc -o foo_test foo_test.c -L. -lfoo -lasmrun

In fact, the following variants don't work:

1) 
$ ocamlopt -output-obj -o foo_caml.o foo.cmxa foo_stub.c foo_export.ml
$ ar -rs libfoo.a /sw/lib/ocaml/libasmrun.a foo_caml.o 
$ gcc -o foo_test foo_test.c -L. -lfoo

2)
$ ocamlopt -output-obj -o foo_caml.o foo.cmxa foo_stub.c foo_export.ml
$ cp /sw/lib/ocaml/libasmrun.a libfoo.a 
$ ar -rs libfoo.a foo_caml.o 
$ gcc -o foo_test foo_test.c -L. -lfoo 

so it seems I have to compile foo_stub.o separately...

but even if I do:

3)
$ ocamlopt -output-obj -o foo_caml.o foo.cmxa foo_stub.c foo_export.ml
$ ocamlopt foo_stub.c
$ ar -rs libfoo.a foo_caml.o foo_stub.o 
$ gcc -o foo_test foo_test.c -L. -lfoo -L/sw/lib/ocaml -lasmrun

4)
$ ocamlopt -output-obj -o foo_caml.o foo.cmxa foo_stub.c foo_export.ml
$ ocamlopt foo_stub.c
$ ar -rs libfoo.a /sw/lib/ocaml/libasmrun.a foo_caml.o 
$ gcc -o foo_test foo_test.c -L. -lfoo

both fail, the only thing that works is when
(a) I compile stub and caml objects separately AND 
(b) use copy to bootstrap the runtime

$ ocamlopt -output-obj -o foo_caml.o foo.cmxa foo_stub.c foo_export.ml
$ ocamlopt foo_stub.c
$ cp /sw/lib/ocaml/libasmrun.a libfoo.a 
$ ar -rs libfoo.a foo_caml.o foo_stub.o
$ gcc -o foo_test foo_test.c -L. -lfoo

In fact ocamlopt does pretty enigmatic things in the background and ar is an entire mystery with this 
copy thing. 
If anyone can make me understand the above, I'd be forever grateful.

thanks
Viktor

 

Ce message et toutes les pieces jointes (ci-apres le "message") sont confidentiels et etablis a l'intention exclusive de ses destinataires. 
Toute utilisation ou diffusion non autorisee est interdite. 
Tout message electronique est susceptible d'alteration. 
Societe Generale Asset Management et ses filiales declinent toute responsabilite au titre de ce message s'il a ete altere, deforme ou falsifie. 
  
Decouvrez l'offre et les services de Societe Generale Asset Management sur le site www.sgam.fr 
  
                                ******** 
  
This message and any attachments (the "message") are confidential and intended solely for the addressees. 
Any unauthorised use or dissemination is prohibited. 
E-mails are susceptible to alteration. 
Neither Societe Generale Asset Management nor any of its subsidiaries or affiliates shall be liable for the message if altered, changed or falsified. 
 
Find out more about Societe Generale Asset Management's proposal on www.sgam.com

[-- Attachment #2: Type: text/html, Size: 17844 bytes --]

             reply	other threads:[~2007-11-22 16:42 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-11-22 16:41 RABIH.ELCHAAR [this message]
  -- strict thread matches above, loose matches on Subject: below --
2007-11-21  7:43 viktor tron
2007-11-21  9:45 ` [Caml-list] " Alain Frisch
2007-11-21 11:21   ` Matthieu Dubuget
2007-11-21 12:05     ` Alain Frisch
2007-11-21 19:48       ` Jon Harrop
2007-11-21 17:06   ` viktor tron
2007-11-21 17:33     ` Alain Frisch
2007-11-21 18:35       ` viktor tron
2007-11-22 17:21         ` Alain Frisch
2007-11-26 17:20         ` Alain Frisch

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=0172C3AE3A0E964797AF43E206C1048F0ED53C@FRCOR-EXMB06.europe.am.socgen \
    --to=rabih.elchaar@sgam.com \
    --cc=caml-list@yquem.inria.fr \
    --cc=viktor.tron.ml@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox