Проблема с библиотекой C, связанной с интерпретатором Python, в Mac OS X - PullRequest
3 голосов
/ 31 августа 2011

Я пытаюсь использовать библиотеку 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

Чтобы ответить на вопросы Неда, я получаю следующий вывод:

$ 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. Что контролирует, какая версия используется для компиляции пакета Python с использованием distutils? Боюсь, это может быть причиной проблемы.

Есть идеи, что может быть причиной этого? Благодаря.

1 Ответ

1 голос
/ 31 августа 2011

Трудно точно понять, в чем проблема, без дополнительной информации, но, похоже, вы используете 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 и более поздних системах.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...