Mac 10.6 Universal Binary scipy:找不到cephes / specfun“_aswfa_”符号

时间:2010-01-28 16:16:33

标签: python architecture osx-snow-leopard scipy universal-binary

当编译为i386 / x86_64通用二进制文件时,我无法在32位模式下运行,并在我的64位10.6.2 MacPro1,1上执行。

我的python设置

this answer的帮助下,我构建了一个32/64位的python 2.6.4的intel通用二进制文件,目的是使用arch命令在架构之间进行选择。 (我设法使用lipo制作了一些我想要的库的通用二进制文件。)一切正常。然后我根据hyperjeff's article上的说明安装了scipy,只有更新的numpy(1.4.0),并且在安装scipy期间暂时忽略了将numpy移到一边。

现在,除了scipy之外的所有内容似乎都可以正常工作,我确实可以使用arch -i386 pythonarch -x86_64 python在32位和64位模式之间进行选择。

错误

Scipy以32位模式抱怨:

$ arch -x86_64 python -c "import scipy.interpolate; print 'success'"
success
$ arch -i386 python -c "import scipy.interpolate; print 'success'"
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/scipy/interpolate/__init__.py", line 7, in <module>
    from interpolate import *
  File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/scipy/interpolate/interpolate.py", line 13, in <module>
    import scipy.special as spec
  File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/scipy/special/__init__.py", line 8, in <module>
    from basic import *
  File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/scipy/special/basic.py", line 8, in <module>
    from _cephes import *
ImportError: dlopen(/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/scipy/special/_cephes.so, 2): Symbol not found: _aswfa_
  Referenced from: /Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/scipy/special/_cephes.so
  Expected in: flat namespace
 in /Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/scipy/special/_cephes.so

尝试追踪问题

看起来scipy.interpolate会导入名为_cephes的内容,它会查找名为_aswfa_的符号,但无法在32位模式下找到它。浏览scipy的源代码,我在specfun.f中找到了一个ASWFA子例程。唯一具有类似名称的scipy产品文件是specfun.so,但是它和_cephes.so似乎都是通用二进制文件:

$ cd /Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/scipy/special/
$ file _cephes.so specfun.so 
_cephes.so: Mach-O universal binary with 2 architectures
_cephes.so (for architecture i386): Mach-O bundle i386
_cephes.so (for architecture x86_64): Mach-O 64-bit bundle x86_64
specfun.so: Mach-O universal binary with 2 architectures
specfun.so (for architecture i386): Mach-O bundle i386
specfun.so (for architecture x86_64): Mach-O 64-bit bundle x86_64
哼哼哼。我被卡住了。我可能会尝试但尚未弄清楚如何以某种方式手动编译specfun.so自己。

我认为所有32位机器都没有破坏scipy,所以我想我安装它的方式有问题,但我无法弄清楚是什么。

鉴于我相当独特的(?)设置,我真的不期待一个完整的答案,但如果有人有任何可能指向正确方向的线索,他们将非常感激。

(编辑)解决问题的更多细节:

我正在使用gfortran(来自GCC 4.2.1 Apple Inc. build 5646的GNU Fortran)。

Python 2.6.4的安装或多或少如此:

cd /tmp
curl -O http://www.python.org/ftp/python/2.6.4/Python-2.6.4.tar.bz2
tar xf Python-2.6.4.tar.bz2
cd Python-2.6.4
# Now replace buggy pythonw.c file with one that supports the "arch" command:
curl http://bugs.python.org/file14949/pythonw.c | sed s/2.7/2.6/ > Mac/Tools/pythonw.c    
./configure --enable-framework=/Library/Frameworks --enable-universalsdk=/ --with-universal-archs=intel
make -j4
sudo make frameworkinstall

Scipy 0.7.1的安装几乎与here相同,但归结为一个简单的sudo python setup.py install

如果按照David Cournapeau的建议使用nm查看_cephes库,那么i386架构中的符号确实是未定义的:

$ nm -arch x86_64 /Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/scipy/special/_cephes.so | grep _aswfa_
00000000000d4950 T _aswfa_
000000000011e4b0 d _oblate_aswfa_data
000000000011e510 d _oblate_aswfa_nocv_data
(snip)
$ nm -arch i386 /Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/scipy/special/_cephes.so | grep _aswfa_
         U _aswfa_
0002e96c d _oblate_aswfa_data
0002e99c d _oblate_aswfa_nocv_data
(snip)
然而,我还不能解释它的缺席。

2 个答案:

答案 0 :(得分:3)

您是否尝试使用使用macports编译的scipy?

sudo port install scipy +universal

(当然,您必须使用相同选项编译链的其余部分pythonpy26-numpy

我明白了:

$ arch -x86_64 /opt/local/bin/python -c "import scipy.interpolate; print 'success'"
success

$ arch -i386 /opt/local/bin/python -c "import scipy.interpolate; print 'success'"
success

然后,您可以使用macports维护者用于进行自己编译的设置和知识。

答案 1 :(得分:1)

你是如何安装scipy的,python版本以及哪个fortran编译器?

您可能还想检查两个拱门中是否确实存在缺失的符号(我不记得功能所在的位置,但您应该能够使用nm /的组合轻松找到ti otool)。