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

2024-04-20 12:13:12 发布

您现在位置:Python中文网/ 问答频道 /正文

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


Tags: install文件代码pycore标题linuxwindows
2条回答

我认为,最重要的是按照Python帮助或PythonDoc网站上的说明为您构建扩展的版本“扩展和嵌入Python解释器”。对于windows,构建说明确定了用于创建从python.org下载的二进制软件包的构建环境,通常类似于VS2013或VS2017。(顺便说一句,我认为社区版具备了您所需的一切,并且我认为在使用CMD.EXE终端的nmake进行构建时,您实际上不必使用Visual Studio GUI。)

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

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

您需要安装正确的标题

$ 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

相关问题 更多 >