使用pybind创建绑定时对虚拟类的ctor的未定义引用

问题描述

我正在尝试使用pybind创建一个虚拟类的python绑定。我一直在关注pybind11文档,这就是我所拥有的

TestField.h

class AbstractTestField
{
public:
    virtual ~AbstractTestField() = default;

    virtual double test() const = 0;
};

class TestField : public AbstractTestField
{
public:
    ~TestField() = default;

    double test() const final;
};
}  // namespace VNCS

TestField.cpp

double VNCS::TestField::test() const
{
    PYBIND11_OVERLOAD_PURE(double,/* Return type */
                           VNCS::TestField,/* Parent class */
                           test             /* Name of function in C++ (must match Python name) */
    );
}

bindings.cpp

#include <pybind11/pybind11.h>
#include "TestField.h"

namespace py = pybind11;

PYBIND11_MODULE(VNCSSofaPlugin,m)
{
    m.doc() = "Test bindings";
    m.attr("__version__") = "dev";

    py::class_<AbstractTestField,TestField>(m,"TestField")
        .def(py::init<>())
        .def("test",&AbstractTestField::test);
}

我正在使用CMake作为构建系统,并且创建了两个目标。一种用于C ++代码,另一种用于绑定。

对于C ++,我有类似的东西

set(SOURCES TestField.cpp)
set(PUBLIC_HEADERS TestField.h)
add_library(VNCSSofaPlugin SHARED ${SOURCES} ${HEADERS})
...

对于绑定我有这个

set(SOURCES bindings.cpp)
pybind11_add_module(VNCSSofaPluginBinding ${SOURCES})

target_link_libraries(VNCSSofaPluginBinding PUBLIC VNCSSofaPlugin)

这可以很好地编译,并且生成两个库:libVNCSSofaPlugin.soVNCSSofaPluginBinding.cpython-38-x86_64-linux-gnu.so

但是,当我尝试在python中导入绑定时,出现以下问题

Python 3.8.6 (default,Sep 30 2020,04:00:38)
[GCC 10.2.0] on linux
Type "help","copyright","credits" or "license" for more information.
>>> import VNCSSofaPluginBinding
Traceback (most recent call last):
  File "<stdin>",line 1,in <module>
ImportError: /mnt/D/jjcasmar/projects/VNCSSofaPlugin/build/Debug/lib/VNCSSofaPluginBinding.cpython-38-x86_64-linux-gnu.so: undefined symbol: _ZTIN4VNCS9TestFieldE

我不明白为什么无法找到构造函数。我在做什么错了?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)