Mac OS X上链接到Python解释器的C库出现问题

Mac OS X上链接到Python解释器的C库出现问题,python,unix,gcc,macos,Python,Unix,Gcc,Macos,我正在尝试使用一个C库,它应该可以从Python中获得。该库在Mac OS X(10.6.0,i386)上使用GCC(版本:i686-apple-darwin10-GCC-4.2.1(GCC)4.2.1(apple Inc.build 5659)进行编译 当我尝试从python中导入python模块时,出现了以下错误: $ python Enthought Python Distribution -- www.enthought.com Version: 7.0-2 (64-bit) Pyth

我正在尝试使用一个C库,它应该可以从Python中获得。该库在Mac OS X(10.6.0,i386)上使用GCC(版本:i686-apple-darwin10-GCC-4.2.1(GCC)4.2.1(apple Inc.build 5659)进行编译

当我尝试从python中导入python模块时,出现了以下错误:

$ python
Enthought Python Distribution -- www.enthought.com
Version: 7.0-2 (64-bit)

Python 2.7.1 |EPD 7.0-2 (64-bit)| (r271:86832, Dec  3 2010, 15:56:20) 
[GCC 4.0.1 (Apple Inc. build 5488)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>> import mymodule
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Library/Frameworks/EPD64.framework/Versions/7.0/lib/python2.7/site-packages/mymodule/__init__.py", line 2, in <module>
    from mymodule import *
ImportError: dlopen(/Library/Frameworks/EPD64.framework/Versions/7.0/lib/python2.7/site-packages/mymodule/mymodule.so, 2): Symbol not found: _b_char
  Referenced from: /Library/Frameworks/EPD64.framework/Versions/7.0/lib/python2.7/site-packages/mymodule/mymodule.so
  Expected in: flat namespace
 in /Library/Frameworks/EPD64.framework/Versions/7.0/lib/python2.7/site-packages/mymodule/mymodule.so
似乎有一个共同的体系结构,但我不确定这是否适用于otool-L的库引用——这些库似乎有多个版本

我注意到的另一件事是,当我制作这个包并编译它,然后制作Python模块时,模块的“build”目录(即与setup.py文件处于同一级别的目录)包含以下Mac OS X 10.5文件:

但是,我使用的是Mac OS X 10.6。什么控制使用distutils编译Python包的版本?我担心这可能会导致问题


知道是什么原因导致了这种情况吗?谢谢。

如果没有更多信息,很难确切知道问题出在哪里,但您似乎正在使用64位版本的Python(来自EPD)。您构建的库是否也构建为64位库?您应该能够通过以下操作来判断:

file $(python -c 'import sys;print(sys.executable)')  # see archs that Python was built with
python -c 'import sys;print(sys.maxsize > 2**32)' ; # see if running as 64-bit (false if 32-bit)
cd /Library/Frameworks/EPD64.framework/Versions/7.0/lib/python2.7/site-packages/mymodule
file mymodule.so       # see what architectures the C extension module is built with
otool -L mymodule.so   # see what libraries are referenced by the C extension module
file /path/to/lib1     # see what archs the referenced lib module(s) are built with
它们之间需要有一个共同的拱门


更新:根据您的其他信息,看起来最可疑的项目是对
/usr/local/lib/libgcc_.s.1.dylib
的库引用。这似乎表明您在
/usr/local
中安装了
gcc
的本地副本或其他编译器。您确定没有在此处混合使用编译器吗?请尝试清理在构建模块之前,构建目录并显式设置导出CC=/usr/bin/gcc-4.0。或者将其他编译器移出
/usr/local
(10.5不应该是问题。这只是表明EPD Python发行版是为在10.5及更高版本的系统上运行而构建的。)

我试过了,但不幸的是,它不起作用。我在尝试编译其他软件包时遇到了类似的问题,比如MySQL python(它似乎很难安装)。当我查看/Developer/SDKs时,我有一个10.6的目录没有使用,所以我想这意味着我有一个额外的编译器。这就是为什么我担心distutils没有调用我的正确版本SDK。有什么想法吗?如果你在OS X 10.6上,
/Developer/SDKs/MacOSX10.6。SDK/
是空的,那么就有问题了您需要为10.6安装合适的Xcode 3(我相信3.2.6是当前版本)在任何情况下,无论是苹果公司的XCODE开发者工具,还是苹果公司的任何其他东西,AFAIK,都不能安装在<代码> /Ur/Sudio中。如果你有<代码> /UrS/ListB/LIb/LIGBGCC */COD>文件,请考虑将它们移走。但是,它们可能是由EPD分布安装的。.你可能想在他们的邮件列表上询问。
$ cd build/
$ ls
lib.macosx-10.5-x86_64-2.7  temp.macosx-10.5-x86_64-2.7
file $(python -c 'import sys;print(sys.executable)')  # see archs that Python was built with
python -c 'import sys;print(sys.maxsize > 2**32)' ; # see if running as 64-bit (false if 32-bit)
cd /Library/Frameworks/EPD64.framework/Versions/7.0/lib/python2.7/site-packages/mymodule
file mymodule.so       # see what architectures the C extension module is built with
otool -L mymodule.so   # see what libraries are referenced by the C extension module
file /path/to/lib1     # see what archs the referenced lib module(s) are built with