簡體   English   中英

未定義的符號:PyOS_InputHook,來自共享庫

[英]undefined symbol: PyOS_InputHook, from shared library

我為一個非python C ++應用程序編寫了一個C ++“ python插件”。
在某個時候,這個.so插件會初始化python解釋器並打開python控制台。
為了方便起見,隨后導入了“ readline”模塊,並且出現以下錯誤:

ImportError:/usr/lib/python2.7/lib-dynload/readline.so:未定義符號:PyOS_InputHook

link命令(由cmake生成)為:

/ usr / bin / c ++ -fPIC -Wall -Wextra -O3 -DNDEBUG -Xlinker -export-dynamic -Wl,-fwhole-program /usr/lib/libpython2.7.a -shared -Wl,-soname,libMyplugin.so -o libMyplugin.so [源代碼] [qt庫] -lGLU -lGL -lX11 -lXext -lc -lc -lpython2.7 -Wl-rpath / src:/usr/local/Trolltech/Qt-4.8.4/ lib:

nm libMyplugin.so給出以下與python相關的符號:

                 U Py_Finalize
                 U Py_Initialize
00000000002114a8 B PyOS_InputHook
                 U PyRun_InteractiveLoopFlags
                 U PyRun_SimpleStringFlags

我們注意到在插件的BSS部分中定義了PyOS_InputHook 但是,python的readline.so找不到它。

問題是為什么,以及如何解決它。

問題在於主應用程序如何加載插件:它使用不帶標志RTLD_GLOBAL的dlopen()。
這意味着插件中存在的當前不需要的符號(例如本例中的PyOS_InputHook)不會被解析,也不會為以后將要加載的其他共享庫(例如本例中的readline.so)解析。

要解決此問題,加載插件時應使用標志RTLD_GLOBAL。
如果無法控制主應用程序(如本例所示)及其使用dlopen()的方式,仍然可以使用帶有標志RTLD_NOLOAD |的dlopen()從插件本身內部“重新加載”插件。 RTLD_GLOBAL,以便解析當前加載的庫中所有以前未解析的符號。

這樣做可以解決問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM