使用cython创建c ++扩展时出现问题

时间:2013-07-31 11:33:01

标签: c++ cython

我正在使用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”中定义,它包含在我的包装类中。

有谁知道问题可能是什么?谢谢!

1 个答案:

答案 0 :(得分:1)

您缺少mser.cpp中的对象代码。告诉cython将它添加到cython文件中的setup.py和distutil源代码中。