我正在使用 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”中定义。
有人知道问题可能是什么吗?谢谢!