【问题标题】:Problem with C library linked to Python interpreter, on Mac OS X在 Mac OS X 上链接到 Python 解释器的 C 库的问题
【发布时间】:2011-08-31 00:14:58
【问题描述】:

我正在尝试使用应该可从 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 包的版本?恐怕这可能会导致问题。

知道是什么原因造成的吗?谢谢。

【问题讨论】:

    标签: python unix gcc macos


    【解决方案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 的库引用。这似乎表明您在/usr/local 中安装了gcc 或其他编译器的本地副本。你确定你没有在这里混合编译器吗?在构建模块之前尝试清理构建目录并明确设置export 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/ 为空,则您的 Xcode 安装有问题。您需要为 10.6 安装合适的 Xcode 3(我相信 3.2.6 是当前版本)避免使用更新的和实验性的 Xcode 4 for 10.6。在任何情况下,Apple 的 Xcode 开发人员工具和 Apple 的任何其他东西(AFAIK)都不会在/usr/local 中安装任何东西。如果那里有 /usr/local/lib/libgcc* 文件,请考虑将它们移开。但也许它们是由 EPD 发行版安装的。您可能想在他们的邮件列表中询问。
    猜你喜欢
    • 2013-05-15
    • 1970-01-01
    • 1970-01-01
    • 2013-01-17
    • 2021-02-17
    • 2014-01-05
    • 2011-10-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多