Version française
Home     About     Download     Resources     Contact us    
Browse thread
RE: [Caml-list] ocamlopt problem
[ Home ] [ Index: by date | by threads ]
[ Search: ]

[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: -- (:)
From: EL CHAAR Rabih SGAM/AI/SAM <RABIH.ELCHAAR@s...>
Subject: RE: [Caml-list] ocamlopt problem
Hello David,
The problem that you are facing is the following:
Your c code is available through dllocamlodbc.dll which is dynamically loaded by the toplevel.

My understanding is that the capacity to load dynamically functions is only available througth the toplevel.
When generating executable (native or bytecode), you should pass the c code embedded in a static library.

You should have a libocamlodbc_.a built from ocaml_odbc_c.o, say via 
$ ar -r libocamlodbc_.a ocaml_odbc_c.o

Here maybe you should pay attention to some aspects of exporting C functions to caml via -DCAML_DLL. If this is the case, you should compile another ocaml_odbc_c.o omitting the definition of this symbol (I don't know if the 
-DODBC2 does this automatically) in order to generate the static library.

This static library should be passed to both ocamlodbc.cma and ocamlodbc.cmxa via

$ ocamlopt -a -o ocamlodbc.cmxa ocaml_odbc.ml ocamlodbc.mli
ocamlodbc.ml -cclib -lodbc32 -cclib -locamlodbc_

$ ocamlc -a -o ocamlodbc.cma ocaml_odbc.ml ocamlodbc.mli ocamlodbc.ml -dllib
-locamlodbc -cclib -locamlodbc_

Afterwards, while building executables, the -cclib directive will be extracted from the library and passed to the c linker.

Hope this helps.

Sincerely
Rabih

PS: What I've described above is the general approach. In your specific case, questioning the presence of ocaml_odbc.o, the answer is that it is not included in the .cmxa, it contains only specific caml code, and flags to pass to the external linkers. When passing a -ccopt ocaml_odbc_c.o to the library, it will be extracted at linking, supposing the corresponding .o is available.

-----Message d'origine-----
De : caml-list-bounces@yquem.inria.fr [mailto:caml-list-bounces@yquem.inria.fr] De la part de David Allsopp
Envoyé : vendredi 2 juin 2006 22:58
À : OCaml List
Objet : [Caml-list] ocamlopt problem

I'm trying to build the ocamlodbc package under Windows using Cygwin/MinGW.
It's all built and working except that I'm having one problem with the
native library. My question, I think, relates to a misunderstanding with
ocamlopt so I'm hoping someone can point out my error! 

I've adapted the INSTALL_mingw.sh script to issue the following commands:

$ gcc -mno-cygwin -c -DODBC2 -DWIN32 -I $OCAMLLIB/caml -I
/usr/include/w32api ocaml_odbc_c.c
$ gcc -mno-cygwin -shared -L $OCAMLLIB -L $OCAMLLIB/../bin -o
dllocamlodbc.dll ocaml_odbc_c.o -lodbc32 -locamlrun 

$ ocamlopt -a -o ocamlodbc.cmxa ocaml_odbc_c.o ocaml_odbc.ml ocamlodbc.mli
ocamlodbc.ml -cclib -lodbc32
$ cp ocamlodbc.cmxa ocamlodbc.a ocamlodbc.cmi $OCAMLLIB

$ ocamlc -a -o ocamlodbc.cma ocaml_odbc.ml ocamlodbc.mli ocamlodbc.ml -dllib
-locamlodbc
$ cp ocamlodbc.cmi ocamlodbc.cma $OCAMLLIB
$ cp dllocamlodbc.dll $OCAMLLIB/stublibs

The top-level library ocamlodbc.cma is working exactly as I'd expect. I then
attempt to compile a program that uses the native library (in this case
Exemples/monitor.ml) with the command

ocamlopt -o monitor.exe ocamlodbc.cmxa monitor.ml

but get the response

gcc: ocaml_odbc_c.o: No such file or directory
Error during linking

Despite trying various -ccopt flags, the only way I can make it compile is
to copy ocaml_odbc_c.o to the current directory. My understanding is that
the ocamlopt statement that built ocamlodbc.cmxa should have included
ocaml_odbc_c.o so why is gcc getting a linker problem when referencing the
library?

Sorry if it's a blindingly obvious mistake...


David

_______________________________________________
Caml-list mailing list. Subscription management:
http://yquem.inria.fr/cgi-bin/mailman/listinfo/caml-list
Archives: http://caml.inria.fr
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
Bug reports: http://caml.inria.fr/bin/caml-bugs
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