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