我在写一个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