`unique_ptr` 在 python 扩展中导致 'undefined symbol'

`unique_ptr`s causing 'undefined symbol' in python extension

我有一个 C++ 项目,它使用了几个 c++14 特性,包括 std::make_unique。

该项目编译和运行良好,并且已经完成了一段时间,但是,现在我正在尝试添加一个 python 接口,但我遇到了一些麻烦。

在我的 python 扩展中,我尝试使用以下方法声明我的 C++ class 是唯一的:

#include <memory>
...
typedef struct {
    PyObject_HEAD
    std::unique_ptr<MyClass> my_instance;
} PyMyClass;
...
self->my_instance = std::make_unique<MyClass>();

在我的 setup.py 文件中,我将 -std=c++14 作为编译器选项包含在内。

使用 python setup.py develop/install 构建良好,但是当我将模块导入 python 时,出现以下错误:

my_module.so: undefined symbol: _Z15build_331792650RSt10unique_ptrIN6grelka5SlaveESt14default_deleteIS1_EE

我需要在某处进行额外的链接步骤吗?

总结评论中的讨论:

这是一个 linker 错误,这意味着您的代码中声明了一些函数或对象,但您没有 link 访问任何定义它的目标文件。如果您使用 c++filt 或 demangler.com 之类的 name demangling 工具,您会发现丢失的符号不是 unique_ptr 本身的一部分,而是函数 build_331792650.

这看起来可能是自动生成的(至少我希望如此,因为如果您使用这种名称编写函数,您可能应该重新考虑您的命名方案),但无论哪种方式,您都需要 link 在包含此函数定义的文件中。