我正在构建一个嵌入 Python 的 Mac OS X 应用程序。从技术上讲,我的应用程序是一个捆绑包(即它的主要可执行文件是 MH_BUNDLE);它是另一个应用程序的插件。我希望它静态嵌入 Python,但希望能够动态加载扩展。
我做了以下操作:我包含了整个库(-force_load path/to/libpython2.7.a
),还重新导出了所有Python符号(-exported_symbol_list path/to/list
),并添加了-u _PyMac_Error
,我用过这个链接建议 http://docs.python.org/extending/embedding.html#linking-requirements。包本身加载良好,所有内部 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)。
The 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 http://bugs.python.org/issue4434,但情况恰恰相反:我静态链接 Python,而另一张海报动态链接它(我们的平台也不同)。对他来说静态链接解决了这个问题。
为什么找不到这个符号?
Update.我怀疑发生这种情况是因为主应用程序加载了它的插件(以及我的包)RTLD_LOCAL
.