嵌入应用的Python解释器无法加载本地模块

0 投票
1 回答
1056 浏览
提问于 2025-04-16 07:19

我有一个应用程序,它静态链接了 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()

撰写回答