我正在嘗試為(Photron)相機驅動程式 DLL 撰寫 Cython 介面。這個庫提供了一個帶有頭檔案的 SDK 和 32 位和 64 位的 Windows 庫。我已經在 VisualStudio 中使用這個庫成功編譯了一個 C 示例。另一方面,Cython 編譯在鏈接時失敗。
自定義用Cython代碼由的typedefs.pxd包含型別的檔案,一個photron.pxd含有來自SDK頭和一個包裝常數和函式宣告檔案CDEF類在一個camera.pyx檔案。
在 setup.py 檔案的 Extension(從 setuptools 匯入)部分中,我包含了以下部分:
include_dirs=[s.path.abspath(os.path.normpath('./include'))],
libraries=[os.path.join(os.path.abspath(os.curdir), 'Lib', '64bit(x64)', 'PDCLIB')],
library_dirs=[os.path.abspath(os.path.normpath('./Lib/64bit(x64)'))],
我還嘗試了成功 C 編譯的命令列中的標志。為了讓初始 cythonization 步驟正常作業(生成 cpp 檔案),我還必須將其添加到 SDK 的標頭中:
#include <windows.h>
以下是 pxd 檔案的相關摘錄:
from typedefs cimport ulong, uint
cdef extern from "PDCFUNC.h":
ulong PDC_CloseDevice(ulong nDeviceNo, ulong *pErrorCode)
當我嘗試編譯代碼時,我得到了 cpp 檔案,但是當我嘗試鏈接時,對于我在 pxd 檔案中宣告的每個函式,我得到一系列如下所示的行:
camera.obj : error LNK2001: unresolved external symbol "unsigned long __cdecl PDC_CloseDevice(unsigned long,unsigned long *)" (?PDC_CloseDevice@@YAKKPEAK@Z)
我想這是因為聯結器試圖在指定的頭檔案中找到一個 __cdecl 函式,盡管這些函式在頭檔案中以這種方式宣告:
unsigned long WINAPI PDC_CloseDevice(unsigned long nDeviceNo, unsigned long *pErrorCode);
由于 Cython 檔案明確指出支持呼叫約定,因此我嘗試:
- 將 WINAPI 呼叫約定添加到 pxd 檔案,但在檔案的 cythonization 期間我在 C 變數宣告中收到語法錯誤。
- 直接添加__stdcall呼叫約定,因為程式無論如何都應該以 64 位編譯。但是我仍然得到 LNK2001 行來尋找__cdecl,就好像 Cython 繞過了呼叫約定一樣。實際上,這是生成的 cpp 檔案中的行:
__pyx_v_ret = PDC_CloseDevice(__pyx_v_self->device_nb, (&__pyx_v_error_code));
該__cdecl警告也可能是一個紅色的鯡魚,但我沒有別的領導,我通常不會在Windows下編譯,所以我有這些工具的知識有限。
uj5u.com熱心網友回復:
在嘗試了其他所有內容(包括正確編譯的 Visual Studio 專案中的所有選項)之后,我用一個最小的示例重新啟動,在pxd檔案中只有以下內容
cdef extern from "PDCLIB.h"
ulong __stdcall PDC_Init(ulong *pErrorCode)
ulong __stdcall PDC_CloseDevice(ulong nDeviceNo, ulong *pErrorCode)
和一個更簡單的pyx檔案,除了擴展名之外,它具有相同的名稱。
from pyphotron_pdclib cimport *
from typedefs cimport ulong, uint
cpdef init_pdc_lib():
cdef ulong error_code = 0
success = PDC_Init(&error_code)
assert success != 0
cpdef close_cam(ulong dev_num):
cdef ulong error_code = 0
success = PDC_CloseDevice(dev_num, &error_code)
assert success != 0
我在編譯中看到的主要區別是
- 它現在在 c 中編譯,因為沒有更多的擴展型別(cdef 類)
- pyx檔案與pxd檔案同名
安裝檔案中的編譯和鏈接選項如下:
extra_compile_args=['/Gz', '/fp:precise', '/Zc:wchar_t', '/Zc:forScope', '/Zc:inline'],
extra_link_args=['/DEBUG', '/MACHINE:X64'],
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/406603.html
標籤:
