模板化c++类的cython包装给出了未定义的符号
cython wrapping of a templated c++ class gives undefined symbol
这似乎应该是一个非常简单的问题,我在这里也看到过类似的讨论,但没有什么能完全解决这个问题。我有一个用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)
相关文章:
- vscode g++链路故障:体系结构x86_64的未定义符号
- 体系结构x86_64的未定义符号:std:terminate(),typeinfo,运算符delete[],运算符new
- C++ 中 dlsym 的未定义符号
- 仅在 MacOS 上析构函数的未定义符号
- OSX clang++:用于 cpp 文件中显式实例化模板的体系结构x86_64的未定义符号
- PCL 出错:体系结构x86_64 @pcl的未定义符号
- clang:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用) - 体系结构的未定义符号 x86_64:
- 体系结构x86_64的未定义符号:链接器错误
- C++ std::vector<int> 体系结构的未定义符号 x86_64:
- 生成文件:体系结构x86_64的未定义符号
- libc++abi未定义符号:_ZTVN10__cxxabif120__si-class_type_infoE
- Xcode"体系结构x86_64的未定义符号"
- 体系结构x86_64的未定义符号:找不到原因
- SWIG链接器:未定义符号:_ZN2cv8fastFreeEPv(cv::fastFree(void*))
- 如何修复架构x86_64的未定义符号,Boost Asio 1.58
- 在Qt5上去静态库:架构的未定义符号x86_64:
- 体系结构x86_64的未定义符号:c++/ h 文件和 cpp 文件
- 监视 SDK 下的未定义符号"__Unwind_SjLj_Unregister"
- 使用 Boost/Python 的未定义符号 - 复杂
- 建筑x86_64的未定义符号:"vtkDebugLeaksManager::vtkDebugLeaksManager()",引用自: