4

我正在使用 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”中定义。

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

4

1 回答 1

1

您缺少 mser.cpp 中的目标代码。告诉 cython 通过将其添加到 setup.py 中的源和 cython 文件中的 distutil 源来包含它。

于 2013-07-31T14:30:28.950 回答