使用cython创建c扩展时出现问题
发布时间:2020-12-16 07:05:24 所属栏目:百科 来源:网络整理
导读:我正在使用 python 2.7,cython 0.19.1和numpy 1.6.1开发osx 10.8.4 64位. 我正在尝试创建一个与python一起使用的c扩展.给出了c代码,我编写了一个包装器c类,以便在python中使用所需的函数.编译工作但导入扩展文件会导致以下错误: Traceback (most recent cal
|
我正在使用
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”中定义,它包含在我的包装器类中. 有谁知道问题可能是什么?谢谢! 解决方法
您缺少mser.cpp中的对象代码.告诉cython将它添加到cython文件中的setup.py和distutil源代码中.
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
