`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 在包含此函数定义的文件中。
我有一个 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 在包含此函数定义的文件中。