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

时间:2011-08-31 00:14:59

标签: python unix gcc macos

我正在尝试使用可以从Python获得的C库。该库在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

要回答Ned的问题,这是我得到的输出:

$ file $(python -c 'import sys;print(sys.executable)') 
/Library/Frameworks/EPD64.framework/Versions/Current/bin/python: Mach-O 64-bit executable x86_64
$ python -c 'import sys;print(sys.maxsize > 2**32)' ;
True
$ cd /Library/Frameworks/EPD64.framework/Versions/7.0/lib/python2.7/site-packages/mymodule
$ file mymodule.so 
mymodule.so: Mach-O 64-bit bundle x86_64
$ otool -L mymodule.so
mymodule.so:
    /usr/local/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 125.2.1)
$ file /usr/lib/libSystem.B.dylib
/usr/lib/libSystem.B.dylib: Mach-O universal binary with 3 architectures
/usr/lib/libSystem.B.dylib (for architecture x86_64):   Mach-O 64-bit dynamically linked shared library x86_64
/usr/lib/libSystem.B.dylib (for architecture i386): Mach-O dynamically linked shared library i386
/usr/lib/libSystem.B.dylib (for architecture ppc7400):  Mach-O dynamically linked shared library ppc
$ file /usr/local/lib/libgcc_s.1.dylib
/usr/local/lib/libgcc_s.1.dylib: Mach-O universal binary with 4 architectures
/usr/local/lib/libgcc_s.1.dylib (for architecture i386):    Mach-O dynamically linked shared library i386
/usr/local/lib/libgcc_s.1.dylib (for architecture x86_64):  Mach-O 64-bit dynamically linked shared library x86_64
/usr/local/lib/libgcc_s.1.dylib (for architecture ppc): Mach-O dynamically linked shared library ppc
/usr/local/lib/libgcc_s.1.dylib (for architecture ppc64):   Mach-O 64-bit dynamically linked shared library ppc64

似乎有一个共同的架构,但我不确定otool -L的库引用是否正确 - 那些似乎有多个版本。

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

$ cd build/
$ ls
lib.macosx-10.5-x86_64-2.7  temp.macosx-10.5-x86_64-2.7

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

知道可能导致这种情况的原因是什么?感谢。

1 个答案:

答案 0 :(得分:1)

如果没有更多信息,很难确切地知道问题是什么,但看起来你使用的是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的库引用。这似乎表明您在gcc中安装了/usr/local或其他编译器的本地副本。你确定你没有在这里混合编译器吗?尝试清理构建目录并在构建模块之前显式设置export CC=/usr/bin/gcc-4.0。或者将其他编译器移出/usr/local。 (10.5不应该是一个问题。这只是表明EPD Python发行版是为在10.5及更高版本的系统上运行而构建的。)