python c扩展,在mac os上使用dlopen的问题

时间:2010-05-07 16:46:15

标签: python linker dlopen setup.py python-c-extension

我采用了一个以二进制库(.a)和头文件形式发布的库,编写了一些c ++代码,并希望将结果包装在python模块中。

我已经完成了这个here

问题是在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的{​​{1}}参数提供distutil.core.Extension,所以我不确定我还应该做些什么。

非常感谢任何帮助。

更新

setup.py生成的编译行如下所示:

extra_link_args

链接器行如下所示:

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

更新2 : 在MacOS 10.5上,将dlopen标志从默认的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) 修改为RTLD_NOW可以解决问题。但是,这在Mac OS 10.6上不起作用。

在10.6上,以下序列允许库正常运行,但我不确定原因:

  1. python setup.py build -v
  2. 再次手动运行链接器行(由setup.py打印到控制台)。
  3. python setup.py install
  4. 我仍然在寻找一个如何让它正常工作的好答案。谢谢!

1 个答案:

答案 0 :(得分:4)

当你看到答案时,你会踢自己!尝试更改此内容:

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

到此:

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

一旦我做了这个改变,我就能够做一个干净的构建并立即导入模块:)