我采用了一个作为二进制库(.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
这看起来像 Carbon 框架中定义的符号没有被正确解析,但我不知道该怎么做。我提供-framework Carbon
给distutil.core.Extension
'sextra_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
- 再次手动运行链接器行(由 setup.py 打印到控制台)。
- python setup.py 安装
我仍在寻找有关如何使其正常工作的好答案。谢谢!