2011-08-25 62 views
1

我有一個C++庫,我用SWIG封裝以便在python中進行訪問。這是我的理解(根據經驗),當SWIG將一個C++庫封裝到python中時,加載時它將C++庫符號放置在「本地」範圍內。那是 - 一個範圍,它不能使未來的動態鏈接庫找到符號。當使用swig爲Python封裝C++時,加載符號的鏈接範圍

(我得到的來自man dlopen(3)「本地」這個定義)

有沒有什麼辦法讓痛飲到這些符號放置到「全局」範圍,這樣今後的任何動態鏈接庫可以找到他們?

回答

1

您可以通過調用syssetdlopenflags加載模塊之前使Python dlopenRTLD_GLOBAL標誌共享對象,例如:

sys.setdlopenflags(dl.RTLD_NOW | dl.RTLD_GLOBAL) 

。 (有關於此的discussion on swig-users

+0

DLopen在64位上不可用,請問這仍然有效嗎? – VolatileStorm

+0

您可以重置它,然後執行默認設置。 'dlopen()'是一個標準調用,內部python *必須*用它來打開模塊的共享對象。有一個關於python文檔的說明,我把它鏈接到「如果DLFCN不可用,它可以使用h2py腳本從/usr/include/dlfcn.h生成」。這是控制Python如何在內部調用'dlopen()',而不是自己調用它。 – Flexo

+0

我會更好地闡述 - 在試圖加載一個帶dl模塊的庫時python會引發一個錯誤,說如果sizeof(int)!= sizeof(void *)那麼它不會讓你使用dlopen。所以它可能會使用它,但它不會讓我使用它。但是在這種情況下,sys.setdlopenflags會起作用嗎? – VolatileStorm