嵌入在应用程序中的Python解释器无法加载本机模块

时间:2010-11-19 08:40:06

标签: python c linux

我有一个静态链接到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

但我仍然得到相同的导入错误。问题在哪里?

1 个答案:

答案 0 :(得分:2)

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