繁体   English   中英

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

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

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

您需要安装正确的标题

$ 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 package

要检查构建的 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...

Most important, I think, is to follow the instructions in the Python help or on the Python doc web site for "Extending and Embedding the Python Interpreter" for the version you are building the extension for. 对于 windows,构建指令标识用于创建二进制 package 的构建环境,您从 python.org 下载,通常类似于 VS2013 或 VS2 (顺便说一句,我认为社区版拥有您需要的一切,而且我认为您在使用来自 CMD.EXE 终端的 nmake 构建时实际上不必使用 Visual Studio GUI。)

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM