这似乎应该是一个非常简单的问题,我在这里看过类似的讨论,但没有什么可以解决这个问题。我有一个用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
在第一种情况下,我的模板错误是什么?
答案 0 :(得分:2)
您需要在一个头文件中实现模板,而不是拆分为element.cc
。当我运行c++file
命令时,它显示编译器无法链接元素构造函数定义
$ c++filt _ZN7elementIiEC1Ei
element<int>::element(int)