Version française
Home     About     Download     Resources     Contact us    

This site is updated infrequently. For up-to-date information, please visit the new OCaml website at

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: 2006-06-05 (11:13)
From: David Allsopp <dra-news@m...>
Subject: RE: [Caml-list] ocamlopt problem
Dear Rabih,

	Thanks for this! While combing through the bottom of the manual page
for linking with C I was looking at how ocamlmklib works and so "discovered"
the ar tool and noted that ocamlodbc.cmxa (well, via ocamlodbc.a obviously)
doesn't contain the C object file and added -cclib -locamlodbc.

	On a separate note, is there an architectural reason why ocamlmklib
is not compiled under Windows? As far as I could see if you've built OCaml
from sources using the MinGW Makefile you've got everything available that
ocamlmklib would need?

	I'm confused with your ocamlc command by the use of the static
library in building ocamlodbc.cma - CAML_DLL isn't defined anywhere in the C
code (or in its build instructions), but dllocamlodbc.dll is working fine -
is that correct? What I have noticed is that if I add -DCAML_DLL then I
don't get this message from gcc when building the DLL:

	Info: resolving _caml_local_roots by linking to
__imp__caml_local_roots (auto-import)

	When building an OCaml executable with ocamlc I thought that C
linker isn't used (because I'd have to PATH it which I only need to do for
ocamlopt). That said, even if it does, the -dllib is still going to cause
the resulting .exe to be dynamically linked with dllocamlodbc.dll (and
therefore require it on any machine that the EXE is taken to, along with
ocamlrun.dll). Slightly confused as to why the -cclib switch to ocamlc



-----Original Message-----
From: EL CHAAR Rabih SGAM/AI/SAM [] 
Sent: 05 June 2006 09:34
To: David Allsopp; OCaml List
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 ocamlodbc.mli -cclib -lodbc32 -cclib -locamlodbc_

$ ocamlc -a -o ocamlodbc.cma ocamlodbc.mli -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.


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

-----Message d'origine-----
De :
[] 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 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 ocamlodbc.mli -cclib -lodbc32
$ cp ocamlodbc.cmxa ocamlodbc.a ocamlodbc.cmi $OCAMLLIB

$ ocamlc -a -o ocamlodbc.cma ocamlodbc.mli -dllib
$ 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/ with the command

ocamlopt -o monitor.exe ocamlodbc.cmxa

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

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


Caml-list mailing list. Subscription management:
Beginner's list:
Bug reports:
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
Decouvrez l'offre et les services de Societe Generale Asset Management sur
le site 
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