附录:在 Windows 上安装 MinGW¶
从 https://www.mingw.org/wiki/HOWTO_Install_the_MinGW_GCC_Compiler_Suite 下载 MinGW 安装程序。(截至撰写本文时,下载链接有点难找;它位于左侧菜单的“关于”下)。您需要名为“Automated MinGW Installer”的文件(当前版本为 5.1.4)。
运行它并安装 MinGW。对于 Cython,仅基本包是严格需要的,尽管您可能还想获取至少 C++ 编译器。
您需要设置 Windows 的“PATH”环境变量,以便它包含例如“c:\mingw\bin”(如果您将 MinGW 安装到“c:\mingw”)。以下网页描述了 Windows XP 中的过程(Vista 的过程类似):https://support.microsoft.com/kb/310519
最后,告诉 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},
...
)