繁体   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