我正在安装Pyglet作为VisPy的依赖项,但安装后看到以下错误
File "/Library/Python/2.7/site-packages/pyglet/lib.py", line 160, in load_library
raise ImportError('Library "%s" not found.' % names[0])
ImportError: Library "c" not found.
通过挖掘源代码,我意识到 Pyglet 正在尝试使用 ctypes 框架加载标准 C 库。
进一步挖掘揭示了实际的(未吞下的)错误:
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ctypes/__init__.py", line 365, in __init__
self._handle = _dlopen(self._name, mode)
OSError: dlopen(/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/usr/lib/libc.dylib, 6): no suitable image found. Did find:
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/usr/lib/libc.dylib: mach-o, but wrong filetype
我认为,这个问题类似于架构不匹配的问题。Python C 绑定框架“ctypes”正在尝试加载具有错误架构的 .dylib。
由于我已将 $LD_LIBRARY_PATH 设置为
/Applications.../MacOSX10.10.sdk/usr/lib/
加载程序偏爱这个目录。但是,如果我尝试从标准位置加载“libc.dylib”,/usr/lib
一切都会完美运行。
明显的潜在问题是“libc”的 XCode 版本适用于 32 位架构,但/usr/lib
适用于 64 位架构。
不对!
这是file
两个库的输出:
XCode 版本
libc.dylib: Mach-O universal binary with 2 architectures
libc.dylib (for architecture x86_64): Mach-O 64-bit dynamically linked shared library stub x86_64
libc.dylib (for architecture i386): Mach-O dynamically linked shared library stub i386
和标准/usr/lib
/usr/lib/libc.dylib: Mach-O universal binary with 2 architectures
/usr/lib/libc.dylib (for architecture x86_64): Mach-O 64-bit dynamically linked shared library x86_64
/usr/lib/libc.dylib (for architecture i386): Mach-O dynamically linked shared library i386
唯一的区别是 XCode 版本是一个“存根”。尽管进行了一些谷歌搜索,但差异并不完全清楚,尽管“存根”dylib 和“非存根”之间的差异似乎是导致问题的原因。
有关我的设置的更多信息:
/usr/bin/python : Python 2.7.10 and appears to be running as a 64-bit app
uname -a: Darwin x-10-104-106-204.uofm-secure.wireless.umn.edu 14.5.0 Darwin Kernel Version 14.5.0: Wed Jul 29 02:26:53 PDT 2015; root:xnu-2782.40.9~1/RELEASE_X86_64 x86_64
因此,我的问题是如何正确链接 XCode 安装的 dylib?
提前感谢所有想法和建议。