如何在Mac OS X 10.7 Lion上以32位模式构建zookeeper/zkpython?
我需要在32位模式下使用32位的Python(因为oracle instantclient-10.2.0.4在64位的Mac OS X上会崩溃,但在32位下可以正常工作)。到目前为止,一切都很好,直到我遇到了zookeeper。实际上,是ZooKeeper的Python绑定(zkpython)。
我尝试让zkpython变成32位,同时保持客户端本身是64位的,因为默认就是这样。但在这种情况下,我在导入时遇到了错误:
Python 2.6.7 (r267:88850, Jul 31 2011, 19:30:54)
[GCC 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2335.15.00)] on darwin
>>> import zookeeper
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: dlopen(./zookeeper.so, 2): Symbol not found: _ZOO_ASSOCIATING_STATE
Referenced from: /Users/nolar/Downloads/zoo/zookeeper.so
Expected in: flat namespace
in /Users/nolar/Downloads/zoo/zookeeper.so
对于Python 2.7也是一样(这里的2.6和2.7都是32位,sys.maxint==2147483647)。我猜它想要32位的zookeeper客户端,因为在编译zkpython时,它只给出了一个有意义的警告:
ld: warning: ignoring file ../../..//src/c/.libs//libzookeeper_mt.dylib, file was built for unsupported file format which is not the architecture being linked (i386)
所以,我尝试让zookeeper客户端本身变成32位。但是无论我尝试什么,我都无法以32位模式构建它:libzookeeper_mt.2.dylib总是64位(我尝试了ARCH_FLAGS="-arch i386",configure --build=i386 --host=i386,arch -i386等等——这个.dylib总是64位)。
$ file libzookeeper_mt.2.dylib
libzookeeper_mt.2.dylib: Mach-O 64-bit dynamically linked shared library x86_64
而且最糟糕的是,它没有内置i386架构,所以我无法用“lipo”提取这个i386版本。
所以,主要的问题是:如何让ZooKeeper的Python绑定在64位的Mac OS X Lion(10.7)上与32位Python一起工作?
次要问题是:如何在64位的Mac OS X Lion 10.7上以32位模式构建ZooKeeper?
2 个回答
把 CFLAGS
传给配置脚本:
export CFLAGS="-pipe -O2 -arch i386"
./configure …
我自己解决了这个问题。这里是解决方案:http://blog.nolar.info/building-32-bit-zookeeper-python-bindings-in-64-bit-mac-os-x/(简单来说,就是修改你的Makefile,在里面的CC定义中加上“-arch i386”)。