2014-03-31 89 views
1

我在寫一個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] [1]:http://stackoverflow.com/questions/145270/calling-cc-from -python – smoothware

回答

1

上次編輯的解決方案適用於32位Python。對於64位:

from ctypes import cdll 
from ctypes import c_void_p 
lib = cdll.LoadLibrary('./SevenEval.so') 
lib.SevenEval_new.restype = c_void_p 


class SevenEval(object): 
    def __init__(self): 
     self.obj = c_void_p(lib.SevenEval_new()) 

    def getRankOfSeven(self, c1, c2, c3, c4, c5, c6, c7): 
     return lib.SevenEval_getRankOfSeven(\ 
     self.obj, c1, c2, c3, c4, c5, c6, c7) 
+1

不要忘記標記爲答案。 – eryksun