嵌入应用的Python解释器无法加载本地模块
我有一个应用程序,它静态链接了 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 个回答
2
除了确保你的二进制文件里包含了libpython的所有内容外,你还需要确保库里的符号可以被加载的共享对象访问到。当你把libpython静态链接到你的主程序时,这就意味着你需要加上--export-dynamic
这个链接器参数(也就是在gcc命令里用-Wl,--export-dynamic
或者-Xlinker --export-dynamic
)。如果你是把libpython嵌入到你应用的插件里,加载共享对象时就需要确保用RTLD_GLOBAL
这个标志来调用dlopen()
。