Appendix: Installing MinGW on Windows

  1. Download the MinGW installer fromhttps://www.mingw.org/wiki/HOWTO_Install_the_MinGW_GCC_Compiler_Suite.(As of thiswriting, the download link is a bit difficult to find; it’s under“About” in the menu on the left-hand side). You want the fileentitled “Automated MinGW Installer” (currently version 5.1.4).

  2. Run it and install MinGW. Only the basic package is strictlyneeded for Cython, although you might want to grab at least theC++ compiler as well.

  3. You need to set up Windows’ “PATH” environment variable so thatincludes e.g. “c:\mingw\bin” (if you installed MinGW to“c:\mingw”). The following web-page describes the procedurein Windows XP (the Vista procedure is similar):https://support.microsoft.com/kb/310519

  4. Finally, tell Python to use MinGW as the default compiler(otherwise it will try for Visual C). If Python is installed to“c:\Python27”, create a file named“c:\Python27\Lib\distutils\distutils.cfg” containing:

    [build]compiler=mingw32

The[WinInst] wiki page contains updated information about thisprocedure. Any contributions towards making the Windows installprocess smoother is welcomed; it is an unfortunate fact that none ofthe regular Cython developers have convenient access to Windows.

Python 3.8+

Since Python 3.8, the search paths of DLL dependencies has been reset.(changelog)

Only the system paths, the directory containing the DLL or PYD fileare searched for load-time dependencies.Instead, a new functionos.add_dll_directory()was added to supply additional search paths. But such a runtime update is not applicable in all situations.

Unlike MSVC, MinGW has its owned standard libraries such aslibstdc++-6.dll,which are not placed in the system path (such asC:\Windows\System32).For a C++ example, you can check the dependencies by MSVC tooldumpbin:

>dumpbin/dependentsmy_gnu_extension.cp38-win_amd64.pyd...Dumpoffilemy_gnu_extension.cp38-win_amd64.pydFileType:DLLImagehasthefollowingdependencies:python38.dllKERNEL32.dllmsvcrt.dlllibgcc_s_seh-1.dlllibstdc++-6.dll...

These standard libraries can be embedded via static linking, by adding the following options to the linker:

-static-libgcc-static-libstdc++-Wl,-Bstatic,--whole-archive-lwinpthread-Wl,--no-whole-archive

Insetup.py, a cross platform config can be added throughextendingbuild_ext class:

fromsetuptoolsimportsetupfromsetuptools.command.build_extimportbuild_extlink_args=['-static-libgcc','-static-libstdc++','-Wl,-Bstatic,--whole-archive','-lwinpthread','-Wl,--no-whole-archive']...# Add extensionsclassBuild(build_ext):defbuild_extensions(self):ifself.compiler.compiler_type=='mingw32':foreinself.extensions:e.extra_link_args=link_argssuper(Build,self).build_extensions()setup(...cmdclass={'build_ext':Build},...)