簡體   English   中英

在Windows上使用gcc(mingw32)從命令行編譯Cython擴展

[英]Compile Cython extensions from the command line with gcc (mingw32) on windows

我正在嘗試在win32上測試一個小型cython模塊,但無法構建它。

該文件稱為linalg_cython.pyx,具有以下內容:

from __future__ import absolute_import, division, print_function
import numpy as np
cimport numpy as np
import cython

#@cython.boundscheck(False)
#np.ndarray[np.float32]
#@cython.wraparound(False)
def L2_sqrd_float32(np.ndarray hist1, np.ndarray hist2):
    """ returns the squared L2 distance
    seealso L2
    Test:
    hist1 = np.random.rand(4, 2)
    hist2 = np.random.rand(4, 2)
    out = np.empty(hist1.shape, dtype=hist1.dtype)
    """
    return (np.abs(hist1 - hist2) ** 2).sum(-1)  # this is faster


L2_sqrd = L2_sqrd_float32

我可以使用setup.py進行編譯,但是我不想依靠setup.py來構建擴展。 這是因為我還沒有完全了解cython編譯過程。 在開始信任setup.py之前,我想先自行編譯它。 話雖如此,我可以通過查看“ setup.py build_ext”的輸出來獲得一個良好的開端:

C:\MinGW\bin\gcc.exe -mdll -O -Wall ^
        -IC:\Python27\Lib\site-packages\numpy\core\include ^
        -IC:\Python27\include -IC:\Python27\PC ^
        -c vtool\linalg_cython.c ^
        -o build\temp.win32-2.7\Release\vtool\linalg_cython.o


writing build\temp.win32-2.7\Release\vtool\linalg_cython.def


C:\MinGW\bin\gcc.exe -shared \
        -s \
        build\temp.win32-2.7\Release\vtool\linalg_cython.o \
        build\temp.win32-2.7\Release\vtool\linalg_cython.def \
        -LC:\Python27\libs \
        -LC:\Python27\PCbuild \
        -lpython27 \
        -lmsvcr90 \
        -o build\lib.win32-2.7\vtool\linalg_cython.pyd

這個創建的pyd文件似乎可以正常工作,但是我的目標是理解,而不僅僅是使其正常工作。

復制這種格式(並自己嘗試一些操作),我目前正在使用這些命令來手動構建所有內容。

C:\Python27\Scripts\cython.exe vtool\linalg_cython.pyx

C:\MinGW\bin\gcc.exe -mdll -O -DNPY_NO_DEPRECATED_API -Wall -Wno-unknown-pragmas
  -Wno-format -Wno-unused-function -m32 -shared
  -IC:\Python27\Lib\site-packages\numpy\core\include -IC:\Python27\include
  -IC:\Python27\PC -IC:\Python27\Lib\site-packages\numpy\core\include
  -LC:\Python27\libs -LC:\Python27\PCbuild -lpython27 -lmsvcr90 -o
  vtool\linalg_cython.pyd -c vtool\linalg_cython.c

我的命令和setup.py命令之間的主要區別在於,我試圖在一行中調用gcc,而不是將其分成兩行。 我會用兩個命令來調用它,但是def文件似乎是由setup.py自動生成的,我不確定它的全部含義。

它的內容看起來很簡單:

LIBRARY linalg_cython.pyd
EXPORTS
initlinalg_cython

但在將命令分為兩步並自己自動生成此def文件之前,我想了解更多信息。 兩種方法都不應該在對gcc的一次調用中創建.pyd嗎?

使用我正在使用的命令,我可以在正確的位置獲取一個.pyd文件,但是當我嘗試導入該文件時,我得到了

<type 'exceptions.ImportError'>: DLL load failed: %1 is not a valid Win32 application.

這應該是x86 / x64不匹配的,因此為什么我嘗試添加標志-m32。

總結:當嘗試簡化一個簡單的cython模塊時,我的gcc命令給了我32/64位錯誤。 如何修復我的gcc命令,使其生成有效的32位pyd文件。

您沒有提到python是32位還是64位。當您嘗試在64位python中導入32位模塊時,通常會發生這種行為,反之亦然。 確保您要導入的python和模塊是相同的體系結構。 解決此問題的最簡單方法是下載並安裝正確的python。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM