如何使用 Cygwin64 为 Windows 构建 C Python 扩展?

How do I build a C Python Extension for Windows using Cygwin64?

前言:我的代码在编译时和 运行 在 Linux 上的预期一样工作。但是,这个库需要编译才能在 Windows 机器上使用。我查看了几个不同的选项,并决定使用 Cygwin 为 Windows 编译似乎是正确的选择。我将 setup.py 文件与 distutils.core 库一起使用,并使用 python setup.py install 进行编译。在 Cygwin 中编译 Windows 时,找不到 pthread.harpa/inet.hnetinet/in.hsys/socket.h。我的印象是 Cygwin 预先打包了这些 headers,这就是我选择使用它的原因。 Cygwin 的替代方案是在任何地方放置预处理器命令并使用 Windows 特定的库,例如 winsock2.h,我希望尽可能避免这种情况。是否可以使用 Cygwin 为 Windows 编译?如果是这样,我做错了什么导致Cygwin无法识别这些headers?

您需要安装正确的 headers

$ cygcheck -p usr/include/pthread.h
Found 9 matches for usr/include/pthread.h
cygwin-devel-3.0.7-1 - cygwin-devel: Core development files
..
cygwin-devel-3.1.6-1 - cygwin-devel: Core development files
...

所以安装 cygwin-devel

要检查构建的dll需要的所有共享库,可以使用cygcheck

$ cygcheck /usr/lib/python3.8/site-packages/Cython/Compiler/FlowControl.cpython-38-x86_64-cygwin.dll
D:\cygwin64\lib\python3.8\site-packages\Cython\Compiler\FlowControl.cpython-38-x86_64-cygwin.
dll
  D:\cygwin64\bin\cygwin1.dll
    C:\WINDOWS\system32\KERNEL32.dll
      C:\WINDOWS\system32\ntdll.dll
      C:\WINDOWS\system32\KERNELBASE.dll
  D:\cygwin64\bin\libpython3.8.dll
    D:\cygwin64\bin\cygintl-8.dll
      D:\cygwin64\bin\cygiconv-2.dll
    D:\cygwin64\bin\cyggcc_s-seh-1.dll

由于是使用 Cygwin Python 构建的,您还需要传输 cygwin python...

我认为,最重要的是按照 Python 帮助或 Python 文档网站上的“扩展和嵌入 Python 解释器”中的说明进行操作您正在为其构建扩展的版本。对于 windows,构建说明标识用于创建您从 python.org 下载的二进制包的构建环境,通常类似于 VS2013 或 VS2017。 (顺便说一句,我认为社区版拥有您需要的一切,而且我认为当您从 CMD.EXE 终端使用 nmake 进行构建时,您实际上不必使用 Visual Studio GUI。)

要在 Cygwin 中构建以用于 Python 的 Windows 版本,您可能需要安装并使用 x86_64-w64-mingw32-gcc 等 cygwin 包进行交叉编译来自 Cygwin 的非 cygwin(即纯 windows)可执行文件和 DLL。

必须使用特定 Python major.minor 版本和位数的源代码树构建二进制扩展。对于 windows,您将需要构建扩展的多个版本,每个 major.minor,将导入它的 Python 的位数版本,例如3.6、3.7、3.8、3.9、32 位、64 位。扩展代码可能不需要在版本之间进行更改,但它仍然需要使用正确的编译器进行编译,并链接到与 Python 可执行文件使用的完全相同的共享库(在本例中为 .DLL 文件)。例如,它必须使用与 Python 可执行文件完全相同版本的 Microsoft C 运行 时间库 DLL。这比 Linux 更敏感和限制性更高,您可以更轻松地使用发行版中的相同工具链重建 python 可执行文件和扩展。