blob: 3fd5e576de0e143cb4d206dedd95eeca36e4cd53 [file] [log] [blame]
Georg Brandl116aa622007-08-15 14:28:22 +00001.. highlightlang:: c
2
3
4.. _building-on-windows:
5
6****************************************
7Building C and C++ Extensions on Windows
8****************************************
9
Georg Brandl116aa622007-08-15 14:28:22 +000010This chapter briefly explains how to create a Windows extension module for
11Python using Microsoft Visual C++, and follows with more detailed background
12information on how it works. The explanatory material is useful for both the
13Windows programmer learning to build Python extensions and the Unix programmer
14interested in producing software which can be successfully built on both Unix
15and Windows.
16
17Module authors are encouraged to use the distutils approach for building
18extension modules, instead of the one described in this section. You will still
19need the C compiler that was used to build Python; typically Microsoft Visual
20C++.
21
22.. note::
23
24 This chapter mentions a number of filenames that include an encoded Python
25 version number. These filenames are represented with the version number shown
Georg Brandl2ee470f2008-07-16 12:55:28 +000026 as ``XY``; in practice, ``'X'`` will be the major version number and ``'Y'``
Georg Brandl116aa622007-08-15 14:28:22 +000027 will be the minor version number of the Python release you're working with. For
28 example, if you are using Python 2.2.1, ``XY`` will actually be ``22``.
29
30
31.. _win-cookbook:
32
33A Cookbook Approach
34===================
35
36There are two approaches to building extension modules on Windows, just as there
37are on Unix: use the :mod:`distutils` package to control the build process, or
38do things manually. The distutils approach works well for most extensions;
39documentation on using :mod:`distutils` to build and package extension modules
40is available in :ref:`distutils-index`. This section describes the manual
41approach to building Python extensions written in C or C++.
42
43To build extensions using these instructions, you need to have a copy of the
44Python sources of the same version as your installed Python. You will need
45Microsoft Visual C++ "Developer Studio"; project files are supplied for VC++
46version 7.1, but you can use older versions of VC++. Notice that you should use
47the same version of VC++that was used to build Python itself. The example files
48described here are distributed with the Python sources in the
49:file:`PC\\example_nt\\` directory.
50
51#. **Copy the example files** --- The :file:`example_nt` directory is a
52 subdirectory of the :file:`PC` directory, in order to keep all the PC-specific
53 files under the same directory in the source distribution. However, the
54 :file:`example_nt` directory can't actually be used from this location. You
55 first need to copy or move it up one level, so that :file:`example_nt` is a
56 sibling of the :file:`PC` and :file:`Include` directories. Do all your work
57 from within this new location.
58
59#. **Open the project** --- From VC++, use the :menuselection:`File --> Open
60 Solution` dialog (not :menuselection:`File --> Open`!). Navigate to and select
61 the file :file:`example.sln`, in the *copy* of the :file:`example_nt` directory
62 you made above. Click Open.
63
64#. **Build the example DLL** --- In order to check that everything is set up
65 right, try building:
66
67#. Select a configuration. This step is optional. Choose
68 :menuselection:`Build --> Configuration Manager --> Active Solution Configuration`
69 and select either :guilabel:`Release` or :guilabel:`Debug`. If you skip this
70 step, VC++ will use the Debug configuration by default.
71
72#. Build the DLL. Choose :menuselection:`Build --> Build Solution`. This
73 creates all intermediate and result files in a subdirectory called either
74 :file:`Debug` or :file:`Release`, depending on which configuration you selected
75 in the preceding step.
76
77#. **Testing the debug-mode DLL** --- Once the Debug build has succeeded, bring
78 up a DOS box, and change to the :file:`example_nt\\Debug` directory. You should
79 now be able to repeat the following session (``C>`` is the DOS prompt, ``>>>``
80 is the Python prompt; note that build information and various debug output from
81 Python may not match this screen dump exactly)::
82
83 C>..\..\PCbuild\python_d
84 Adding parser accelerators ...
85 Done.
86 Python 2.2 (#28, Dec 19 2001, 23:26:37) [MSC 32 bit (Intel)] on win32
87 Type "copyright", "credits" or "license" for more information.
88 >>> import example
89 [4897 refs]
90 >>> example.foo()
91 Hello, world
92 [4903 refs]
93 >>>
94
95 Congratulations! You've successfully built your first Python extension module.
96
97#. **Creating your own project** --- Choose a name and create a directory for
98 it. Copy your C sources into it. Note that the module source file name does
99 not necessarily have to match the module name, but the name of the
100 initialization function should match the module name --- you can only import a
Georg Brandl60203b42010-10-06 10:11:56 +0000101 module :mod:`spam` if its initialization function is called :c:func:`initspam`,
102 and it should call :c:func:`Py_InitModule` with the string ``"spam"`` as its
Georg Brandl116aa622007-08-15 14:28:22 +0000103 first argument (use the minimal :file:`example.c` in this directory as a guide).
104 By convention, it lives in a file called :file:`spam.c` or :file:`spammodule.c`.
Georg Brandl48310cd2009-01-03 21:18:54 +0000105 The output file should be called :file:`spam.pyd` (in Release mode) or
Benjamin Peterson3e4f0552008-09-02 00:31:15 +0000106 :file:`spam_d.pyd` (in Debug mode). The extension :file:`.pyd` was chosen
107 to avoid confusion with a system library :file:`spam.dll` to which your module
108 could be a Python interface.
109
Georg Brandl116aa622007-08-15 14:28:22 +0000110 Now your options are:
111
112#. Copy :file:`example.sln` and :file:`example.vcproj`, rename them to
Georg Brandl15641922010-12-28 09:29:19 +0000113 :file:`spam.\*`, and edit them by hand, or
Georg Brandl116aa622007-08-15 14:28:22 +0000114
115#. Create a brand new project; instructions are below.
116
117 In either case, copy :file:`example_nt\\example.def` to :file:`spam\\spam.def`,
118 and edit the new :file:`spam.def` so its second line contains the string
119 '``initspam``'. If you created a new project yourself, add the file
120 :file:`spam.def` to the project now. (This is an annoying little file with only
121 two lines. An alternative approach is to forget about the :file:`.def` file,
122 and add the option :option:`/export:initspam` somewhere to the Link settings, by
123 manually editing the setting in Project Properties dialog).
124
125#. **Creating a brand new project** --- Use the :menuselection:`File --> New
126 --> Project` dialog to create a new Project Workspace. Select :guilabel:`Visual
127 C++ Projects/Win32/ Win32 Project`, enter the name (``spam``), and make sure the
128 Location is set to parent of the :file:`spam` directory you have created (which
129 should be a direct subdirectory of the Python build tree, a sibling of
130 :file:`Include` and :file:`PC`). Select Win32 as the platform (in my version,
131 this is the only choice). Make sure the Create new workspace radio button is
132 selected. Click OK.
133
134 You should now create the file :file:`spam.def` as instructed in the previous
135 section. Add the source files to the project, using :menuselection:`Project -->
136 Add Existing Item`. Set the pattern to ``*.*`` and select both :file:`spam.c`
137 and :file:`spam.def` and click OK. (Inserting them one by one is fine too.)
138
139 Now open the :menuselection:`Project --> spam properties` dialog. You only need
140 to change a few settings. Make sure :guilabel:`All Configurations` is selected
141 from the :guilabel:`Settings for:` dropdown list. Select the C/C++ tab. Choose
142 the General category in the popup menu at the top. Type the following text in
143 the entry box labeled :guilabel:`Additional Include Directories`::
144
145 ..\Include,..\PC
146
147 Then, choose the General category in the Linker tab, and enter ::
148
149 ..\PCbuild
150
151 in the text box labelled :guilabel:`Additional library Directories`.
152
153 Now you need to add some mode-specific settings:
154
155 Select :guilabel:`Release` in the :guilabel:`Configuration` dropdown list.
156 Choose the :guilabel:`Link` tab, choose the :guilabel:`Input` category, and
157 append ``pythonXY.lib`` to the list in the :guilabel:`Additional Dependencies`
158 box.
159
160 Select :guilabel:`Debug` in the :guilabel:`Configuration` dropdown list, and
161 append ``pythonXY_d.lib`` to the list in the :guilabel:`Additional Dependencies`
162 box. Then click the C/C++ tab, select :guilabel:`Code Generation`, and select
163 :guilabel:`Multi-threaded Debug DLL` from the :guilabel:`Runtime library`
164 dropdown list.
165
166 Select :guilabel:`Release` again from the :guilabel:`Configuration` dropdown
167 list. Select :guilabel:`Multi-threaded DLL` from the :guilabel:`Runtime
168 library` dropdown list.
169
170If your module creates a new type, you may have trouble with this line::
171
Georg Brandlec12e822009-02-27 17:11:23 +0000172 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Georg Brandl116aa622007-08-15 14:28:22 +0000173
Daniel Stutzbach38615992010-09-14 16:02:01 +0000174Static type object initializers in extension modules may cause
175compiles to fail with an error message like "initializer not a
176constant". This shows up when building DLL under MSVC. Change it to::
Georg Brandl116aa622007-08-15 14:28:22 +0000177
Georg Brandlec12e822009-02-27 17:11:23 +0000178 PyVarObject_HEAD_INIT(NULL, 0)
Georg Brandl116aa622007-08-15 14:28:22 +0000179
180and add the following to the module initialization function::
181
Georg Brandl15641922010-12-28 09:29:19 +0000182 if (PyType_Ready(&MyObject_Type) < 0)
183 return NULL;
Georg Brandl116aa622007-08-15 14:28:22 +0000184
185
186.. _dynamic-linking:
187
188Differences Between Unix and Windows
189====================================
190
191.. sectionauthor:: Chris Phoenix <cphoenix@best.com>
192
193
194Unix and Windows use completely different paradigms for run-time loading of
195code. Before you try to build a module that can be dynamically loaded, be aware
196of how your system works.
197
198In Unix, a shared object (:file:`.so`) file contains code to be used by the
199program, and also the names of functions and data that it expects to find in the
200program. When the file is joined to the program, all references to those
201functions and data in the file's code are changed to point to the actual
202locations in the program where the functions and data are placed in memory.
203This is basically a link operation.
204
205In Windows, a dynamic-link library (:file:`.dll`) file has no dangling
206references. Instead, an access to functions or data goes through a lookup
207table. So the DLL code does not have to be fixed up at runtime to refer to the
208program's memory; instead, the code already uses the DLL's lookup table, and the
209lookup table is modified at runtime to point to the functions and data.
210
211In Unix, there is only one type of library file (:file:`.a`) which contains code
212from several object files (:file:`.o`). During the link step to create a shared
213object file (:file:`.so`), the linker may find that it doesn't know where an
214identifier is defined. The linker will look for it in the object files in the
215libraries; if it finds it, it will include all the code from that object file.
216
217In Windows, there are two types of library, a static library and an import
218library (both called :file:`.lib`). A static library is like a Unix :file:`.a`
219file; it contains code to be included as necessary. An import library is
220basically used only to reassure the linker that a certain identifier is legal,
221and will be present in the program when the DLL is loaded. So the linker uses
222the information from the import library to build the lookup table for using
223identifiers that are not included in the DLL. When an application or a DLL is
224linked, an import library may be generated, which will need to be used for all
225future DLLs that depend on the symbols in the application or DLL.
226
227Suppose you are building two dynamic-load modules, B and C, which should share
228another block of code A. On Unix, you would *not* pass :file:`A.a` to the
229linker for :file:`B.so` and :file:`C.so`; that would cause it to be included
230twice, so that B and C would each have their own copy. In Windows, building
231:file:`A.dll` will also build :file:`A.lib`. You *do* pass :file:`A.lib` to the
232linker for B and C. :file:`A.lib` does not contain code; it just contains
233information which will be used at runtime to access A's code.
234
235In Windows, using an import library is sort of like using ``import spam``; it
236gives you access to spam's names, but does not create a separate copy. On Unix,
237linking with a library is more like ``from spam import *``; it does create a
238separate copy.
239
240
241.. _win-dlls:
242
243Using DLLs in Practice
244======================
245
246.. sectionauthor:: Chris Phoenix <cphoenix@best.com>
247
248
249Windows Python is built in Microsoft Visual C++; using other compilers may or
250may not work (though Borland seems to). The rest of this section is MSVC++
251specific.
252
253When creating DLLs in Windows, you must pass :file:`pythonXY.lib` to the linker.
254To build two DLLs, spam and ni (which uses C functions found in spam), you could
255use these commands::
256
257 cl /LD /I/python/include spam.c ../libs/pythonXY.lib
258 cl /LD /I/python/include ni.c spam.lib ../libs/pythonXY.lib
259
260The first command created three files: :file:`spam.obj`, :file:`spam.dll` and
261:file:`spam.lib`. :file:`Spam.dll` does not contain any Python functions (such
Georg Brandl60203b42010-10-06 10:11:56 +0000262as :c:func:`PyArg_ParseTuple`), but it does know how to find the Python code
Georg Brandl116aa622007-08-15 14:28:22 +0000263thanks to :file:`pythonXY.lib`.
264
265The second command created :file:`ni.dll` (and :file:`.obj` and :file:`.lib`),
266which knows how to find the necessary functions from spam, and also from the
267Python executable.
268
269Not every identifier is exported to the lookup table. If you want any other
270modules (including Python) to be able to see your identifiers, you have to say
271``_declspec(dllexport)``, as in ``void _declspec(dllexport) initspam(void)`` or
272``PyObject _declspec(dllexport) *NiGetSpamData(void)``.
273
274Developer Studio will throw in a lot of import libraries that you do not really
275need, adding about 100K to your executable. To get rid of them, use the Project
276Settings dialog, Link tab, to specify *ignore default libraries*. Add the
277correct :file:`msvcrtxx.lib` to the list of libraries.
278