我有一个静态链接到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
但我仍然得到相同的导入错误。问题在哪里?
答案 0 :(得分:2)
除了确保二进制文件中包含所有libpython之外,还需要确保库中的符号暴露给正在加载的共享对象。当您将libpython(静态)链接到主二进制文件时,这意味着您需要--export-dynamic
链接器参数(因此-Wl,--export-dynamic
或-Xlinker --export-dynamic
作为gcc参数。)当加载共享对象时libpython(比如,当您将libpython嵌入到应用程序的插件中时),这意味着您必须确保共享对象已加载RTLD_GLOBAL
标记到dlopen()
。