Я взял библиотеку, которая распространяется в виде двоичной библиотеки (.a) и заголовка, написал против нее код на С ++ и хочу обернуть результаты в модуле python.
I 'мы сделали это здесь .
Проблема в том, что при импорте этого модуля в 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
Это похоже на символы, определенные в Carbonрамки не решаются должным образом, но я не уверен, что с этим делать.Я передаю -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 следующая последовательность позволяет библиотеке работать должным образом, хотя я не уверен почему:
- python setup.py build -v
- runлиния компоновщика (выводится на консоль setup.py) снова, вручную.
- python setup.py install
Я все еще ищу хороший ответ о том, как получитьэто работать правильно.Спасибо!