簡體   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