我正在使用python 2.7,cython 0.19.1和numpy 1.6.1开发osx 10.8.4 64位。
我正在尝试创建一个与python一起使用的c ++扩展。给出了c ++代码,我编写了一个包装器c ++类,以便在python中使用所需的函数。编译工作但导入扩展文件会导致以下错误:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: dlopen(./mserP.so, 2): Symbol not found: __ZN4mser12MSERDetectorC1Ejj
Referenced from: ./mserP.so
Expected in: flat namespace
in ./mserP.so
我尝试了一个较小的例子,其中包含一个简单的c ++类,其函数有一个numpy数组作为参数。导入和使用扩展文件效果很好!
这里是包装类(maser_wrapper.cpp):
#include "mser_wrapper.h"
#include "mser.h"
#include <iostream>
namespace mser {
CallMser::CallMser(unsigned int imageSizeX,unsigned int imageSizeY)
{
//Create MSERDetector
mser::MSERDetector* detector = new mser::MSERDetector(imageSizeX, imageSizeY);
}
CallMser::~CallMser()
{
delete detector;
}
}
这里是cython文件(mserP.pyx):
# distutils: language = c++
# distutils: sources= mser_wrapper.cpp
cdef extern from "mser_wrapper.h" namespace "mser":
cdef cppclass CallMser:
CallMser(unsigned int, unsigned int) except +
cdef class PyCallMser:
cdef CallMser *thisptr
def __cinit__(self, unsigned int imageSizeX, unsigned int imageSizeY):
self.thisptr = new CallMser(imageSizeX, imageSizeY)
def __dealloc__(self):
del self.thisptr
最后但并非最不重要的是setup.py:
from distutils.core import setup
from Cython.Build import cythonize
setup(ext_modules = cythonize(
"mserP.pyx", # our Cython source
sources=["mser_wrapper.cpp"], # additional source file(s)
language="c++", # generate C++ code
))
在命名空间“mser”中,类“MSERDetector”存在但无法找到。它在头文件“mser.h”中定义,它包含在我的包装类中。
有谁知道问题可能是什么?谢谢!
答案 0 :(得分:1)
您缺少mser.cpp中的对象代码。告诉cython将它添加到cython文件中的setup.py和distutil源代码中。