附录:在 Windows 上安装 MinGW

  1. https://www.mingw.org/wiki/HOWTO_Install_the_MinGW_GCC_Compiler_Suite 下载 MinGW 安装程序。(截至撰写本文时,下载链接有点难找;它位于左侧菜单的“关于”下)。您需要名为“Automated MinGW Installer”的文件(当前版本为 5.1.4)。

  2. 运行它并安装 MinGW。对于 Cython,仅基本包是严格需要的,尽管您可能还想获取至少 C++ 编译器。

  3. 您需要设置 Windows 的“PATH”环境变量,以便它包含例如“c:\mingw\bin”(如果您将 MinGW 安装到“c:\mingw”)。以下网页描述了 Windows XP 中的过程(Vista 的过程类似):https://support.microsoft.com/kb/310519

  4. 最后,告诉 Python 使用 MinGW 作为默认编译器(否则它将尝试使用 Visual C)。如果 Python 安装到“c:\Python27”,则创建一个名为“c:\Python27\Lib\distutils\distutils.cfg”的文件,其中包含

    [build]
    compiler = mingw32
    

[WinInst] wiki 页面包含有关此过程的更新信息。欢迎任何有助于使 Windows 安装过程更顺畅的贡献;不幸的是,没有一个常规的 Cython 开发人员可以方便地访问 Windows。

Python 3.8+

从 Python 3.8 开始,DLL 依赖项的搜索路径已重置。(变更日志

仅搜索系统路径和包含 DLL 或 PYD 文件的目录以查找加载时依赖项。相反,添加了一个新函数 os.add_dll_directory() 来提供其他搜索路径。但是,这种运行时更新并不适用于所有情况。

与 MSVC 不同,MinGW 有自己的标准库,例如 libstdc++-6.dll,这些库不会放在系统路径中(例如 C:\Windows\System32)。对于 C++ 示例,您可以通过 MSVC 工具 dumpbin 检查依赖项

> dumpbin /dependents my_gnu_extension.cp38-win_amd64.pyd
...
Dump of file my_gnu_extension.cp38-win_amd64.pyd

File Type: DLL

  Image has the following dependencies:

      python38.dll
      KERNEL32.dll
      msvcrt.dll
      libgcc_s_seh-1.dll
      libstdc++-6.dll
      ...

这些标准库可以通过静态链接嵌入,方法是将以下选项添加到链接器

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

setup.py 中,可以通过扩展 build_ext 类添加跨平台配置

from setuptools import setup
from setuptools.command.build_ext import build_ext

link_args = ['-static-libgcc',
             '-static-libstdc++',
             '-Wl,-Bstatic,--whole-archive',
             '-lwinpthread',
             '-Wl,--no-whole-archive']

...  # Add extensions

class Build(build_ext):
    def build_extensions(self):
        if self.compiler.compiler_type == 'mingw32':
            for e in self.extensions:
                e.extra_link_args = link_args
        super(Build, self).build_extensions()

setup(
    ...
    cmdclass={'build_ext': Build},
    ...
)