.. highlightlang:: c


.. _building-on-windows:

****************************************
Building C and C++ Extensions on Windows
****************************************

This chapter briefly explains how to create a Windows extension module for
Python using Microsoft Visual C++, and follows with more detailed background
information on how it works.  The explanatory material is useful for both the
Windows programmer learning to build Python extensions and the Unix programmer
interested in producing software which can be successfully built on both Unix
and Windows.

Module authors are encouraged to use the distutils approach for building
extension modules, instead of the one described in this section. You will still
need the C compiler that was used to build Python; typically Microsoft Visual
C++.

.. note::

   This chapter mentions a number of filenames that include an encoded Python
   version number.  These filenames are represented with the version number shown
   as ``XY``; in practice, ``'X'`` will be the major version number and ``'Y'``
   will be the minor version number of the Python release you're working with.  For
   example, if you are using Python 2.2.1, ``XY`` will actually be ``22``.


.. _win-cookbook:

A Cookbook Approach
===================

There are two approaches to building extension modules on Windows, just as there
are on Unix: use the :mod:`distutils` package to control the build process, or
do things manually.  The distutils approach works well for most extensions;
documentation on using :mod:`distutils` to build and package extension modules
is available in :ref:`distutils-index`.  This section describes the manual
approach to building Python extensions written in C or C++.

To build extensions using these instructions, you need to have a copy of the
Python sources of the same version as your installed Python. You will need
Microsoft Visual C++ "Developer Studio"; project files are supplied for VC++
version 7.1, but you can use older versions of VC++.  Notice that you should use
the same version of VC++that was used to build Python itself. The example files
described here are distributed with the Python sources in the
:file:`PC\\example_nt\\` directory.

#. **Copy the example files** ---  The :file:`example_nt` directory is a
   subdirectory of the :file:`PC` directory, in order to keep all the PC-specific
   files under the same directory in the source distribution.  However, the
   :file:`example_nt` directory can't actually be used from this location.  You
   first need to copy or move it up one level, so that :file:`example_nt` is a
   sibling of the :file:`PC` and :file:`Include` directories.  Do all your work
   from within this new location.

#. **Open the project** ---  From VC++, use the :menuselection:`File --> Open
   Solution` dialog (not :menuselection:`File --> Open`!).  Navigate to and select
   the file :file:`example.sln`, in the *copy* of the :file:`example_nt` directory
   you made above.  Click Open.

#. **Build the example DLL** ---  In order to check that everything is set up
   right, try building:

#. Select a configuration.  This step is optional.  Choose
   :menuselection:`Build --> Configuration Manager --> Active Solution Configuration`
   and select either :guilabel:`Release`  or :guilabel:`Debug`.  If you skip this
   step, VC++ will use the Debug configuration by default.

#. Build the DLL.  Choose :menuselection:`Build --> Build Solution`.  This
   creates all intermediate and result files in a subdirectory called either
   :file:`Debug` or :file:`Release`, depending on which configuration you selected
   in the preceding step.

#. **Testing the debug-mode DLL** ---  Once the Debug build has succeeded, bring
   up a DOS box, and change to the :file:`example_nt\\Debug` directory.  You should
   now be able to repeat the following session (``C>`` is the DOS prompt, ``>>>``
   is the Python prompt; note that build information and various debug output from
   Python may not match this screen dump exactly)::

      C>..\..\PCbuild\python_d
      Adding parser accelerators ...
      Done.
      Python 2.2 (#28, Dec 19 2001, 23:26:37) [MSC 32 bit (Intel)] on win32
      Type "copyright", "credits" or "license" for more information.
      >>> import example
      [4897 refs]
      >>> example.foo()
      Hello, world
      [4903 refs]
      >>>

   Congratulations!  You've successfully built your first Python extension module.

#. **Creating your own project** ---  Choose a name and create a directory for
   it.  Copy your C sources into it.  Note that the module source file name does
   not necessarily have to match the module name, but the name of the
   initialization function should match the module name --- you can only import a
   module :mod:`spam` if its initialization function is called :c:func:`PyInit_spam`,
   (see :ref:`building`, or use the minimal :file:`Modules/xxmodule.c` as a guide).
   By convention, it lives in a file called :file:`spam.c` or :file:`spammodule.c`.
   The output file should be called :file:`spam.pyd` (in Release mode) or
   :file:`spam_d.pyd` (in Debug mode). The extension :file:`.pyd` was chosen
   to avoid confusion with a system library :file:`spam.dll` to which your module
   could be a Python interface.

   Now your options are:

#. Copy :file:`example.sln` and :file:`example.vcproj`, rename them to
   :file:`spam.\*`, and edit them by hand, or

#. Create a brand new project; instructions are below.

   In either case, copy :file:`example_nt\\example.def` to :file:`spam\\spam.def`,
   and edit the new :file:`spam.def` so its second line contains the string
   '``initspam``'.  If you created a new project yourself, add the file
   :file:`spam.def` to the project now.  (This is an annoying little file with only
   two lines.  An alternative approach is to forget about the :file:`.def` file,
   and add the option :option:`/export:initspam` somewhere to the Link settings, by
   manually editing the setting in Project Properties dialog).

#. **Creating a brand new project** ---  Use the :menuselection:`File --> New
   --> Project` dialog to create a new Project Workspace.  Select :guilabel:`Visual
   C++ Projects/Win32/ Win32 Project`, enter the name (``spam``), and make sure the
   Location is set to parent of the :file:`spam` directory you have created (which
   should be a direct subdirectory of the Python build tree, a sibling of
   :file:`Include` and :file:`PC`).  Select Win32 as the platform (in my version,
   this is the only choice).  Make sure the Create new workspace radio button is
   selected.  Click OK.

   You should now create the file :file:`spam.def` as instructed in the previous
   section. Add the source files to the project, using :menuselection:`Project -->
   Add Existing Item`. Set the pattern to ``*.*`` and select both :file:`spam.c`
   and :file:`spam.def` and click OK.  (Inserting them one by one is fine too.)

   Now open the :menuselection:`Project --> spam properties` dialog. You only need
   to change a few settings.  Make sure :guilabel:`All Configurations` is selected
   from the :guilabel:`Settings for:` dropdown list.  Select the C/C++ tab.  Choose
   the General category in the popup menu at the top.  Type the following text in
   the entry box labeled :guilabel:`Additional Include Directories`::

      ..\Include,..\PC

   Then, choose the General category in the Linker tab, and enter ::

      ..\PCbuild

   in the text box labelled :guilabel:`Additional library Directories`.

   Now you need to add some mode-specific settings:

   Select :guilabel:`Release` in the :guilabel:`Configuration` dropdown list.
   Choose the :guilabel:`Link` tab, choose the :guilabel:`Input` category, and
   append ``pythonXY.lib`` to the list in the :guilabel:`Additional Dependencies`
   box.

   Select :guilabel:`Debug` in the :guilabel:`Configuration` dropdown list, and
   append ``pythonXY_d.lib`` to the list in the :guilabel:`Additional Dependencies`
   box.  Then click the C/C++ tab, select :guilabel:`Code Generation`, and select
   :guilabel:`Multi-threaded Debug DLL` from the :guilabel:`Runtime library`
   dropdown list.

   Select :guilabel:`Release` again from the :guilabel:`Configuration` dropdown
   list.  Select :guilabel:`Multi-threaded DLL` from the :guilabel:`Runtime
   library` dropdown list.

If your module creates a new type, you may have trouble with this line::

   PyVarObject_HEAD_INIT(&PyType_Type, 0)

Static type object initializers in extension modules may cause
compiles to fail with an error message like "initializer not a
constant".  This shows up when building DLL under MSVC.  Change it to::

   PyVarObject_HEAD_INIT(NULL, 0)

and add the following to the module initialization function::

   if (PyType_Ready(&MyObject_Type) < 0)
        return NULL;


.. _dynamic-linking:

Differences Between Unix and Windows
====================================

.. sectionauthor:: Chris Phoenix <cphoenix@best.com>


Unix and Windows use completely different paradigms for run-time loading of
code.  Before you try to build a module that can be dynamically loaded, be aware
of how your system works.

In Unix, a shared object (:file:`.so`) file contains code to be used by the
program, and also the names of functions and data that it expects to find in the
program.  When the file is joined to the program, all references to those
functions and data in the file's code are changed to point to the actual
locations in the program where the functions and data are placed in memory.
This is basically a link operation.

In Windows, a dynamic-link library (:file:`.dll`) file has no dangling
references.  Instead, an access to functions or data goes through a lookup
table.  So the DLL code does not have to be fixed up at runtime to refer to the
program's memory; instead, the code already uses the DLL's lookup table, and the
lookup table is modified at runtime to point to the functions and data.

In Unix, there is only one type of library file (:file:`.a`) which contains code
from several object files (:file:`.o`).  During the link step to create a shared
object file (:file:`.so`), the linker may find that it doesn't know where an
identifier is defined.  The linker will look for it in the object files in the
libraries; if it finds it, it will include all the code from that object file.

In Windows, there are two types of library, a static library and an import
library (both called :file:`.lib`).  A static library is like a Unix :file:`.a`
file; it contains code to be included as necessary. An import library is
basically used only to reassure the linker that a certain identifier is legal,
and will be present in the program when the DLL is loaded.  So the linker uses
the information from the import library to build the lookup table for using
identifiers that are not included in the DLL.  When an application or a DLL is
linked, an import library may be generated, which will need to be used for all
future DLLs that depend on the symbols in the application or DLL.

Suppose you are building two dynamic-load modules, B and C, which should share
another block of code A.  On Unix, you would *not* pass :file:`A.a` to the
linker for :file:`B.so` and :file:`C.so`; that would cause it to be included
twice, so that B and C would each have their own copy.  In Windows, building
:file:`A.dll` will also build :file:`A.lib`.  You *do* pass :file:`A.lib` to the
linker for B and C.  :file:`A.lib` does not contain code; it just contains
information which will be used at runtime to access A's code.

In Windows, using an import library is sort of like using ``import spam``; it
gives you access to spam's names, but does not create a separate copy.  On Unix,
linking with a library is more like ``from spam import *``; it does create a
separate copy.


.. _win-dlls:

Using DLLs in Practice
======================

.. sectionauthor:: Chris Phoenix <cphoenix@best.com>


Windows Python is built in Microsoft Visual C++; using other compilers may or
may not work (though Borland seems to).  The rest of this section is MSVC++
specific.

When creating DLLs in Windows, you must pass :file:`pythonXY.lib` to the linker.
To build two DLLs, spam and ni (which uses C functions found in spam), you could
use these commands::

   cl /LD /I/python/include spam.c ../libs/pythonXY.lib
   cl /LD /I/python/include ni.c spam.lib ../libs/pythonXY.lib

The first command created three files: :file:`spam.obj`, :file:`spam.dll` and
:file:`spam.lib`.  :file:`Spam.dll` does not contain any Python functions (such
as :c:func:`PyArg_ParseTuple`), but it does know how to find the Python code
thanks to :file:`pythonXY.lib`.

The second command created :file:`ni.dll` (and :file:`.obj` and :file:`.lib`),
which knows how to find the necessary functions from spam, and also from the
Python executable.

Not every identifier is exported to the lookup table.  If you want any other
modules (including Python) to be able to see your identifiers, you have to say
``_declspec(dllexport)``, as in ``void _declspec(dllexport) initspam(void)`` or
``PyObject _declspec(dllexport) *NiGetSpamData(void)``.

Developer Studio will throw in a lot of import libraries that you do not really
need, adding about 100K to your executable.  To get rid of them, use the Project
Settings dialog, Link tab, to specify *ignore default libraries*.  Add the
correct :file:`msvcrtxx.lib` to the list of libraries.

