2017-01-28 73 views
0

我正在通過創建c擴展名將一些python代碼嵌入到kdb數據庫中。爲此,我需要將我的代碼編譯到共享庫中,並在我的kdb q腳本中加載共享庫。我遇到的這個問題是當我嘗試導入numpy模塊時。我得到一個錯誤,說PyType_GenericNew是未定義的。這發生在運行時間而不是編譯時間。使用python c api獲取共享對象的完整路徑

我正在構建的共享庫與libpython3.5m.so鏈接,但我想這不會導出全局符號。當我做了一個在main()中導入numpy的測試可執行文件時,它運行良好。我可以通過調用dlopen("libpython3.5m.so", RTLD_NOW | RTLD_GLOBAL)來解決共享庫中的這個問題。但我不太喜歡這個解決方案,因爲它不是很健壯。說例如我改變了我的編譯選項,喜歡反對libpython3.4m。然後我需要更改源代碼,所以dlopen打開libpython3.4m。

當我使用-lpython3.5m選項鍊接全局導出所有符號時,有沒有辦法告訴gcc?這樣我可以跳過dlopen。

否則是否有什麼可以告訴我python共享庫的路徑,我目前正在使用的python c api?即像dlopen(Py_GetLibraryPath(), RTLD_NOW | RTLD_GLOBAL)

+0

'readelf -d youlib.so'顯示依賴於libpython3.5m嗎?鏈接器可能已將其刪除。 – yugr

+0

它具有依賴性。 – chasep255

回答

0

您的問題與導出符號無關,但與動態鏈接器定位PyType_GenericNew。如果libpython3.5m.so位於您的庫路徑中,並且您的動態鏈接程序找不到它,則運行strace ldd ./program將提供關於它在哪裏查找的提示,並且位置良好的符號鏈接可能會將您排除在外。