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
[Caml-list] ocamlmklib missing in win32 ?
[ Home ] [ Index: by date | by threads ]
[ Search: ]

[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: -- (:)
From: Dmitry Bely <dbely@m...>
Subject: Re: [Caml-list] ocamlmklib missing in win32 ?
Xavier Leroy <> writes:

>> I had been trying to install some additional packages in my system.
>> My original intention was to install PXP.  I am getting closer now. I have
>> managed PCRE (with some hints and files from Yutaka OIWA).
>> I needed to build (I think) the wlex - runtime to get PXP built.
>> But while building wlex broke because there is no ocamlmklib in my system.
> Correct: ocamlmklib is only available under Unix (and Cygwin), but not
> for the native Win32 port of OCaml.
> The reason is as follows: ocamlmklib builds both a DLL and a static
> library from a common set of C object files.  This works fine under
> Unix because (with the right compilation options) the same object
> files can be used in both DLL and static contexts.  But this isn't so
> under Windows: object files for a DLL need to be compiled with
> different, incompatible flags than object files for a static library.

IMHO that's wrong. /M* compiler flags specify which Microsoft runtime library our
compiled module (no matter dll, static lib, or standalone exe) will be
linked with. _DLL macro, that /MD also defines, is just intended for use in
Microsoft headers (they are slightly different for DLL-packaged
runtime). So you can build a DLL with /MT flag and using #if _DLL in misc.h
seems to not be very correct. As a solution that requires mininal changes,
but uses the same compiler flags for building both static and dynamic
libraries, I would suggest

#if defined(_WIN32)
# if defined(_MSC_VER) 
/* Supress the warning, generated by dllimport declaration */
/* and dllexport definition if both are present            */
#  pragma warning(disable: 4273)
# endif
# define CAMLexport __declspec(dllexport)
# define CAMLprim __declspec(dllexport)
# define CAMLextern __declspec(dllimport) extern
# define CAMLexport
# define CAMLprim
# define CAMLextern extern

replace CAMLextern with CAMLexport in function definitions (looks like a


It works -- I have just done "make -f Makefile.nt clean world opt bootstrap".

> Hence, the Windows Makefiles for a mixed OCaml/C library must be
> written in such a way that C files are compiled twice, with the
> correct flags, and the building of the DLL and of the static library
> must be done by hand.  To see how to proceed, refer to 
> otherlibs/*/Makefile.nt in the OCaml source distribution.
> Sorry for the inconvenience, but once more Windows makes things more
> complex than they really need to be :-)

- Dmitry Bely

To unsubscribe, mail Archives:
Bug reports: FAQ:
Beginner's list: