[英]RuntimeWarning: PyOS_InputHook is not available for interactive use of PyGTK
[英]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.