2014-03-31 50 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