gpt4 book ai didi

c++ - 模板化 c++ 类的 cython 包装给出 undefined symbol

转载 作者:太空狗 更新时间:2023-10-29 21:45:12 24 4
gpt4 key购买 nike

这似乎应该是一个非常简单的问题,我在这里看到过类似的讨论,但没有什么能完全解决这个问题。我有一个用 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

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

//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 命令时,它显示编译器无法链接 element constructor 定义

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

关于c++ - 模板化 c++ 类的 cython 包装给出 undefined symbol ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18169409/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com