2017-08-17 35 views
-1

我有一个C++项目,它使用了包括std :: make_unique在内的一些C++ 14功能。`unique_ptr`在Python扩展中导致'未定义的符号'

该项目编译和运行良好,并做了一段时间,但是,现在我想添加一个python界面,我有一些麻烦。

在我的Python扩展我试图声明我的C++类作为唯一使用:

#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但是当我导入模块进入蟒蛇,我得到以下错误:

my_module.so: undefined symbol: _Z15build_331792650RSt10unique_ptrIN6grelka5SlaveESt14default_deleteIS1_EE

我需要的地方做一个额外的链接步骤?

+1

您能否给出与您的简化示例相关的错误消息,而不是实际代码中的错误消息?在这种情况下,我想你可能已经简化了它,直到问题没有出现。这就是为什么人们经常要求[完整和可验证的示例](https://stackoverflow.com/help/mcve),以便他们能够重现错误并进行调查。无论如何,它所抱怨的符号是'build_331792650(std :: unique_ptr >&)'(从'C++ filt'程序中获得);这对你来说意味着什么? –

+2

这是一个有用的[工具](https://demangler.com/)来在线取消该符号。是的,因为@丹尼尔提到提供一个[MCVE],请重现该错误。 – user0042

+0

由于它编译和链接正常,它最有可能与python在运行时如何搜索动态库(.so)有关。你有没有更新环境变量,以便它可以找到你的库? –

回答

1

总结讨论的意见:

这是一个链接错误,这意味着有一些功能或对象在你的代码中声明,但是你不链接到它定义的任何目标文件。如果您使用工具(如c++filt或demangler.com),您会看到缺少的符号不是unique_ptr本身的一部分,而是功能build_331792650

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

相关问题