【发布时间】:2011-05-10 18:17:37
【问题描述】:
我正在构建一个要嵌入 Python 的 Mac OS X 应用程序。我的应用程序在技术上是一个包(即它的主要可执行文件是 MH_BUNDLE);它是另一个应用程序的插件。我希望它静态嵌入 Python,但希望能够动态加载扩展。
我做了以下事情:我包含了整个库 (-force_load path/to/libpython2.7.a),还重新导出了所有 Python 符号 (-exported_symbol_list path/to/list),并添加了 -u _PyMac_Error,这是我使用 this linking advice 获得的。捆绑包本身加载正常,所有内部 Python 代码似乎都可以工作,但是当它尝试导入动态库 (time.so) 时失败,并显示以下消息:
Traceback (most recent call last):
...
ImportError: dlopen(/<stripped>/time.so, 2): Symbol not found: _PyExc_OverflowError
Referenced from: /<stripped>/time.so
Expected in: dynamic lookup
这个符号是 Python API 的一部分,它必须已经在我的包中。我可以检查一下:
nm -g Build/Debug/pyfm | grep _PyExc_OverflowError
00172884 D _PyExc_OverflowError
0019cde0 D _PyExc_OverflowError
(它列出了两次,因为我有两种架构,i386 和 ppc)。
time.so 没有引用任何内容,据我了解,这是设计使然:
otool -L "/<stripped>/time.so"
/<stripped>/time.so (architecture ppc):
/usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 88.3.11)
/<stripped>/time.so (architecture i386):
/usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 88.3.11)
我的问题似乎与this 相似,但反过来:我确实静态链接 Python,而另一张海报动态链接它(我们的平台也不同)。对他来说,静态链接解决了这个问题。
为什么找不到符号?
更新。我怀疑这是因为主应用程序使用RTLD_LOCAL 加载了它的插件(以及我的包)。
【问题讨论】:
标签: python macos dynamic lookup