模板化c++类的cython包装给出了未定义的符号

cython wrapping of a templated c++ class gives undefined symbol

本文关键字:未定义 符号 包装 c++ 类的 cython      更新时间:2023-10-16

这似乎应该是一个非常简单的问题,我在这里也看到过类似的讨论,但没有什么能完全解决这个问题。我有一个用c++编写的类,我想用cython访问它。下面的简单例子说明了这个问题,它编译得很好,但是,当我使用它时,我会得到一个ImportError

//element.h
template <typename T>
class element{
    public:
        element(T);
        ~element();
        T data;
};

//element.cc
#include  "element.h"
template <typename T>
element<T>::element(T _data){
    data = _data;
}
template <typename T>
    element<T>::~element(){
}

它可以通过以下简单的cython 访问

cdef extern from "element.h":
    cdef cppclass element[T]:
        element(T) except +
        T data
cdef element[int] *el = new element[int](3)
print el.data

并与一起就地编译

from distutils.core import setup, Extension
from Cython.Distutils import build_ext
ext_modules = [Extension("example",
               ['example.pyx','./element.cc'],
               language = "c++")]
setup(cmdclass = {'build_ext':build_ext},
    name = 'example',
    ext_modules = ext_modules)

然而,当我尝试导入生成的共享库时,我得到了

ImportError: .../example.so: undefined symbol: _ZN7elementIiEC1Ei

例如,如果我简单地去掉所有的模板和强制int,代码编译得很好(和以前一样),但这次它运行了。所以,换句话说,这很好。

//element.h                                                                                                                                                                                             
class element{
    public:
        element(int);
        ~element();
        int data;
};

//element.cc
#include  "element.h"
element::element(int _data){
    data = _data;
}
element::~element(){
}

//example.pyx
cdef extern from "element.h":
    cdef cppclass element:
        element(int) except +
        int data
cdef element *el = new element(3)
print el.data

在第一种情况下,我在模板方面做错了什么?

您需要在一个头文件中实现模板,而不是拆分为element.cc。当我运行c++file命令时,它显示编译器未能链接元素构造函数定义

$ c++filt _ZN7elementIiEC1Ei
element<int>::element(int)