我想在Pybind11中包装一个模板类函数的共享指针。我的类是模板队列:MyQueue.hpp
template<typename Data>
class MyQueue {
public:
std::queue <Data> the_queue;
static std::shared_ptr<MyQueue<Data>> make_data_q_ptr();
};
MyQueue.cpp
template<typename Data>
std::shared_ptr<MyQueue<Data>> MyQueue<Data>::make_data_q_ptr(){
std::shared_ptr<MyQueue<Data>> data_q_ptr;
data_q_ptr = std::make_shared<MyQueue<Data>>();
return data_q_ptr;
}
MyQueue中的数据类型:DataType.cpp
class DataType
{
public:
uint mynumber;
};
使用Pybind11的包装器:wrap.cpp
namespace py = pybind11;
PYBIND11_MODULE(mymodule, m){
py::class_<MyQueue<DataType>, std::shared_ptr<MyQueue<DataType>>>(m, "MyQueue_DataType")
.def(py::init<>())
.def_static("make_data_q_ptr",&MyQueue<DataType>::make_data_q_ptr);
py::class_<DataType>(m, "DataType")
.def(py::init<>())
.def_readwrite("mynumber",&DataType::mynumber);
}
命令编译代码
g++ -shared -fPIC `pkg-config --cflags --libs opencv` -lpthread -std=c++11 -I./pybind11/include/ `python3.7 -m pybind11 --includes` *.cpp -o mymodule.so `python3.7-config --ldflags`
代码编译成功,但是当我尝试导入我创建的模块"mymodule"时,我得到这个错误:importterror: undefined symbol: xxx
>>> import mymodule
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: /home/pi/templedpybind11/mymodule.so: undefined symbol: _ZN7MyQueueI8DataTypeE15make_data_q_ptrEv
你能帮帮我吗?谢谢你。
Move
template<typename Data>
std::shared_ptr<MyQueue<Data>> MyQueue<Data>::make_data_q_ptr(){
std::shared_ptr<MyQueue<Data>> data_q_ptr;
data_q_ptr = std::make_shared<MyQueue<Data>>();
return data_q_ptr;
}
放到头文件中。在需要看到它的地方,它是不可见的。