Python c расширение, проблемы с dlopen на Mac OS

Я взял библиотеку, которая распределяется как двоичный lib (.a) и заголовок, написанный некоторый код C++ против него, и хотят обернуть результаты в модуле Python.

Я сделал это здесь.

Проблема состоит в том, что при импорте этого модуля на MAC OSX (я попробовал 10.5 и 10.6), я получаю следующую ошибку:

dlopen(/Library/Python/2.5/site-packages/dirac.so, 2): Symbol not found: _DisposePtr
  Referenced from: /Library/Python/2.5/site-packages/dirac.so
  Expected in: dynamic lookup

Это похоже на символы, определенные в Углеродной платформе, правильно не разрешаются, но я не уверен, что сделать об этом. Я предоставляю -framework Carbon кому: distutil.core.Extension extra_link_args параметр, таким образом, я не уверен, что еще я должен сделать.

Любая справка очень ценилась бы.

Обновление:

Строка компиляции, сгенерированная setup.py, похожа на это:

gcc -fno-strict-aliasing -Wno-long-double -no-cpp-precomp -mno-fused-madd -fno-common -dynamic -DNDEBUG -g -Os -Wall -Wstrict-prototypes -DMACOSX -I/usr/include/ffi -DENABLE_DTRACE -arch i386 -arch ppc -pipe -Isource -I/System/Library/Frameworks/Python.framework/Versions/2.5/Extras/lib/python/numpy/core/include -I/System/Library/Frameworks/Python.framework/Versions/2.5/Extras/lib/python/numpy/numarray -I/usr/lib/python/2.5/site-packages/numpy/numarray/numpy -I/usr/lib/python/2.5/site-packages/numpy/numarray -I/usr/lib/python/2.5/site-packages/numpy/core/include -I/System/Library/Frameworks/Python.framework/Versions/2.5/include/python2.5 -c source/Dirac_LE.cpp -o build/temp.macosx-10.5-i386-2.5/source/Dirac_LE.o

Строка компоновщика похожа на это:

g++ -Wl,-F. -bundle -undefined dynamic_lookup -arch i386 -arch ppc build/temp.macosx-10.5-i386-2.5/diracmodule.o build/temp.macosx-10.5-i386-2.5/source/Dirac_LE.o -Llibs/MacOSX -lDiracLE -o build/lib.macosx-10.5-i386-2.5/dirac.so -framework Carbon

otool отчеты:

dirac.so:
 /usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 7.4.0)
 /usr/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 111.1.5)

Обновление 2: На MacOS 10.5, изменяя флаги dlopen от значения по умолчанию RTLD_NOW кому: RTLD_LAZY решает проблему. Однако это не работает над Mac OS 10.6.

На 10,6, следующая последовательность позволяет библиотеке работать правильно, хотя я не уверен почему:

  1. Python setup.py создает-v
  2. выполните строку компоновщика (распечатанный к консоли setup.py) снова, вручную.
  3. Python setup.py установка

Я все еще ищу хороший ответ относительно того, как заставить это работать правильно.Спасибо!

9
задан Jason Sundram 9 April 2013 в 05:25
поделиться

1 ответ

Вы ударите себя, когда увидите ответ к этому! Попробуйте изменить это:

link_args = ['-framework Carbon'] if platform == 'Darwin' else []

на это:

link_args = ['-framework', 'Carbon'] if platform == 'Darwin' else []

Как только я внес это изменение, я смог сделать чистую сборку и сразу же импортировать модуль :)

4
ответ дан 3 November 2019 в 07:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: