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