Next Previous Contents

9. Building and using Win32 DLLs

%* * %************************************************************************

On Win32 platforms, the compiler is capable of both producing and using dynamic link libraries (DLLs) containing ghc-compiled code. This section shows you how to make use of this facility.

%************************************************************************ %* *

9.1 Linking with DLLs

%* * %************************************************************************

The default on Win32 platforms is to link applications in such a way that the executables will use the Prelude and system libraries DLLs, rather than contain (large chunks of) them. This is transparent at the command-line, so

sh$ cat main.hs
module Main where
main = putStrLn "hello, world!"
sh$ ghc -o main main.hs
ghc: module version changed to 1; reason: no old .hi file
sh$ strip main.exe
sh$ ls -l main.exe
-rwxr-xr-x   1 544      everyone     6144 May  3 17:11 main.exe*
sh$ ./main
hello, world!
sh$ 

will give you a binary as before, but the main.exe generated will use the Prelude and RTS DLLs instead.

6K for a "hello, world" application - not bad, huh? :-)

%************************************************************************ %* *

9.2 Not linking with DLLs

%* * %************************************************************************

If you want to build an executable that doesn't depend on any ghc-compiled DLLs, use the -static option to link in the code statically.

Notice that you cannot mix code that has been compiled with -static and not, so you have to use the -static option on all the Haskell modules that make up your application.

%************************************************************************ %* *

9.3 Creating a DLL

%* * %************************************************************************

Sealing up your Haskell library inside a DLL is quite straightforward; compile up the object files that make up the library, and then build the DLL by issuing the following command:

sh$ ghc --mk-dll -o HSsuper.dll A.o Super.o B.o libmine.a -lgdi32

By feeding the ghc compiler driver the option --mk-dll, it will build a DLL rather than produce an executable. The DLL will consist of all the object files and archives given on the command line.

A couple of things to notice:


Next Previous Contents