我有一个静态链接到libpython.a(2.7)的应用程序。在应用程序的解释器中,我尝试导入time模块(time.so),但失败的原因是:

ImportError: ./time.so: undefined symbol: PyExc_IOError

所以,这个模块有未解析的符号:
nm -D time.so | grep PyExc_IOError
         U PyExc_IOError

我认为链接器在链接应用程序时会丢弃此符号。好的,我现在将libpython链接到所有符号:
... -Wl,-whole-archive -lpython -Wl,-no-whole-archive ...

符号现在在那里:
$ nm app | grep PyExc_IOError
8638348 D PyExc_IOError
08638ca0 d _PyExc_IOError

但我还是会遇到同样的导入错误。问题在哪里?

最佳答案

除了确保所有libpython都包含在二进制文件中之外,还需要确保库中的符号公开给正在加载的共享对象。当您将libpython(静态地)链接到主二进制文件中时,这意味着您需要--export-dynamic链接器参数(因此-Wl,--export-dynamic-Xlinker --export-dynamic作为gcc参数)。当使用libpython加载共享对象(例如,将libpython嵌入到应用程序的插件中)时,这意味着您必须确保使用RTLD_GLOBAL标记将共享对象加载到dlopen()

关于python - 应用程序中嵌入的Python解释器无法加载 native 模块,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4223312/

10-11 23:22