未定义符号:PyOS_InputHook,来自共享库

2024-05-11 19:03:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我为一个非Python C++应用程序编写了一个C++“Python插件”。 在某种程度上,这个插件,即.so,会初始化python解释器并打开一个python控制台。
为了方便起见,然后导入“readline”模块,我们得到以下错误:

导入错误:/usr/lib/python2.7/lib-dynload/阅读线.so:未定义符号:PyOS_InputHook

link命令(由cmake生成)执行:

/usr/bin/c++-fPIC-Wall-Wextra-O3-DNDEBUG-Xlinker-export-dynamic-Wl,-fwhole程序/usr/lib/libpython2.7.a-shared-Wl,-soname,libMyplugin.so-olibMyplugin.so[sources][qt-libs]-lGLU-lGL-lX11-lxet-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

我们注意到PyOS_InputHook是在插件的BSS部分定义的。但是,python的readline.so却找不到它。在

问题是为什么,以及如何修复它。在


Tags: py插件readlinesolibusr错误符号
1条回答
网友
1楼 · 发布于 2024-05-11 19:03:43

问题在于主应用程序如何加载插件:它使用dlopen()而不使用RTLD_GLOBAL标志。
这意味着插件中当前不需要的符号(如本例中的PyOS_InputHook)不会被解析,也不会为以后加载的其他共享库解析(比如阅读线.so在这种情况下)。在

要解决这个问题,在加载插件时应该使用RTLD\u GLOBAL标志。
如果无法控制主应用程序(如本例中所示)以及它如何使用dlopen(),则仍然可以使用带有RTLD_NOLOAD | RTLD_GLOBAL标志的dlopen()从插件本身“重新加载”插件,以便解析当前加载的库中所有以前未解析的符号。在

这样做可以解决问题。在

相关问题 更多 >