簡體   English   中英

使用Windows上的ctypes在python中包裝c ++函數:找不到函數

[英]Wrapping c++ functions in python with ctypes on windows : function not found

我需要運行一系列python腳本來計算各種腳本,這些腳本工作正常,但其中一個運行速度很慢,必須用C ++完成。 C ++代碼已准備就緒,但我需要找到一種從python調用C ++函數並獲取返回值的方法。

我找到了有關SWIG的信息,但是沒有讓它在Windows上使用Visual Studio(我必須在Windows上的VS中執行它,因為其他限制)。 我發現使用標准輸入和輸出值的非常簡單的函數更容易使用ctypes。

所以我用ctypes進行了很多測試,嘗試了我在網上找到的所有例子,每次都會發生的事情是我可以加載dll(用visual studio 2012編譯器構建),但是當我嘗試在python中調用函數時,它只是:

Traceback (most recent call last):
  File "test.py", line 3, in <module>
    print maLib.plop()
  File "C:\Python27\lib\ctypes\__init__.py", line 378, in __getattr__
    func = self.__getitem__(name)
  File "C:\Python27\lib\ctypes\__init__.py", line 383, in __getitem__
    func = self._FuncPtr((name_or_ordinal, self))
AttributeError: function 'plop' not found

python代碼是(test.py):

from ctypes import cdll
lib = cdll.LoadLibrary('test')
print lib.plop()

C ++代碼是(test.cpp,編譯為test.dll,Visual Studio設置為構建為dll):

extern "C"
{
    int plop();
}

int plop() { return 4; }

正如您所看到的,我試圖讓它盡可能簡單,以避免細節使其失敗。 我已經閱讀了python ctypes幫助,以及如何使用ctypes的教程,嘗試與它們完全相同的代碼,但我不得不適應一點,因為我使用的是Visual Studio / windows,而其他大多數用戶都在使用linux。 所有文件都在同一個文件夾中。

我嘗試了多種加載庫的方法:LoadLibrary('。/ name.dll'),WinDLL('name.dll'),給函數一個不同的名稱,void返回類型等等......

你認為我應該使用SWIG嗎? 我的問題是一個明顯的初學者錯誤嗎? 我是一名學生,對我正在使用的大部分內容都很陌生,但我在這方面付出了很多努力,即使我只需要它來完成一項特定的任務。 當使用SWIG時,我不得不用函數指針或引用創建一個包裝器,所以我認為這是問題,這讓我想嘗試一個更簡單的解決方案。

我正在使用:Python 2.7.7,Visual Studio 2012,Windows 8.1

提前謝謝了

Python報告的錯誤非常清楚。

函數'plop'未找到

這意味着DLL不會導出該名稱的函數。 因此,您需要導出該功能。 使用.def文件或使用__declspec(dllexport)

extern "C"
{
    __declspec(dllexport) int plop();
}

要檢查DLL以調試此類問題,請使用dumpbin或Dependency Walker。

請注意,由於未指定調用約定,因此使用缺省的__cdecl 這意味着cdllctypes方面是正確的。

您需要為您的函數提供“C”鏈接以避免名稱損壞 聲明如下:

extern "C"
{
    int plop();
}

然后它將被恰當地稱為“plop”,而不是被命名為。

暫無
暫無

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

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