2017-08-17 94 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

這看起來像它可能是自動生成的(至少我希望如此,因爲如果你正在用這種名稱編寫函數,你應該重新考慮你的命名方案),但無論哪種方式,你都需要鏈接包含這個函數定義的文件。

相關問題