我在寫一個Python應用程序,我需要能夠從項目SpecialKEvalSevenEval.cpp
文件調用C++函數getRankOfSeven
。由於性能的明顯原因,我必須運行SpecialKval的C++版本,而不是python版本,因爲我的應用程序的要點是計算獲勝概率的蒙特卡洛模擬。將C++代碼嵌入Python與Ctypes(SpecialKEY)
我編譯這些文件:
g++ -o SevenEval.so -shared -fPIC FiveEval.cpp SevenEval.cpp
並導入輸出到Python:
from ctypes import cdll
se = cdll.LoadLibrary('./SevenEval.so')
這種負載沒有問題,但se.SevenEval()
拋出AttributeError: ./SevenEval.so: undefined symbol: SevenEval
我已經閱讀,爲了ctypes的工作,我需要有C對象/功能,而不是C + +的,那已經完成了包裝extrect "C" {
,但我不知道任何C/C++(我只用Python代碼),所以我不知道該怎麼做,這些例子太簡單了,無法適應我的問題。
我在詢問之前搜尋了很多,也許解決方案已經存在,但由於我的C/C++水平低,我不知道該怎麼做。如果有人能給我一些指導方針,詳細的例子,或者爲我做這個,我會非常高興。
注:運行在Ubuntu 13.10 64位,Python2.7
Smoothware評論後編輯。
好吧,這是功能上SevenEval.h聲明: short getRankOfSeven(const int CARD1, const int CARD2, const int CARD3, const int CARD4, const int CARD5, const int CARD6, const int CARD7);
而這就是我在文件末尾添加:
extern "C" {
SevenEval* SevenEval_new(){ return new SevenEval(); }
short SevenEval_getRankOfSeven(SevenEval* foo, const int CARD1, const int CARD2, const int CARD3, const int CARD4, const int CARD5, const int CARD6, const int CARD7){ foo->getRankOfSeven(CARD1, CARD2, CARD3, CARD4, CARD5, CARD6, CARD7);}
}
這是我的Python文件:
from ctypes import cdll
lib = cdll.LoadLibrary('./SevenEval.so')
class SevenEval(object):
def __init__(self):
self.obj = lib.SevenEval_new()
def getRankOfSeven(self, c1, c2, c3, c4, c5, c6, c7):
lib.SevenEval_getRankOfSeven(self.obj, c1, c2, c3, c4, c5, c6, c7)
se = SevenEval() # Runs OK
print se.getRankOfSeven(1,2,3,4,5,6,7) # Gives Segmentation fault (core dumped)
我做錯了什麼?
你絕對不是搜索非常 [看這裏] [1] [1]:http://stackoverflow.com/questions/145270/calling-cc-from -python – smoothware