9

バイナリ ライブラリ (.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.Extensionextra_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 インストール

これを適切に機能させる方法については、まだ良い答えを探しています。ありがとう!

4

1 に答える 1

4

これに対する答えを見たとき、あなたは自分自身を蹴るつもりです! これを変更してみてください:

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

これに:

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

この変更を行うと、クリーンビルドを実行してモジュールをすぐにインポートできました:)

于 2010-05-25T14:18:35.233 に答える