1

SWIG でラップされた C++ ライブラリを python モジュールにコンパイルしています。これは、モジュールのように透過的にライブラリを使用するために個人が配布できることが理想的です。OSX 10.8.2でcmakeとswigを使用してライブラリを構築しています(システムフレームワーク-Apple python2.7.2、インストール済みフレームワーク-python.org python 2.7.5)

私が遭遇している問題は、フレームワークとリンクした後、「互換バージョン 2.7.0」でコンパイルされていることを示しているにもかかわらず、コンパイルされたライブラリが実行されている python のバージョンを非常に選択することです。otool -L異なるディストリビューションにはわずかに異なるリンカー シンボルがあり、何かが壊れ始めているようです。

最も一般的な問題は、Python カーネルがクラッシュすることです(この質問Fatal Python error: PyThreadState_Get: no current threadによると、リンクの非互換性を示しています)。ライブラリがコンパイルされたPythonで動作するようにライブラリを取得できます。

残念ながら、このライブラリは大学の研究室で使用するためのものであり、さまざまな年齢とオペレーティング システムのコンピューターを使用しており、その多くは何年も更新されていない独自のソフトウェアを実行するために永久に廃止されており、私には確かに時間がありません。 ITをプレイしてそれらすべてを修正するために、現在、ほとんどのコンピューターが何らかの方法でそれを取得できるため、最新のEnthoughtディストリビューションに付属するpythonのバージョンに対してコンパイルしています. 私が一緒に仕事をしている研究者の多くは、インタープリターが組み込まれている、彼らの分野に固有の Python IDE を使用していますが、変更可能ではなく、フレームワーク ビルドでもありません (したがって、私はそれに対してビルドすることはできません)。応急処置として Enthought で実験スクリプトを実行できますが、理想的ではありません。Pythonに対してリンクする場合でも。

いずれにせよ、問題は、どのインタープリターがそれをインポートしているかに関係なく (少なくとも OSX 上で) 実行されるように、SWIG でラップされた Python ライブラリーをリンクする方法があるかどうかです (2.7 以上であることが保証されているような特定の最小条件が与えられた場合)。 .0)。

編集

cmake で次のリンカ フラグを使用して canopy/python インストール バージョンに対してコンパイルする

set (CMAKE_SHARED_LINKER_FLAGS "-L ~/Library/Enthought/Canopy_32bit/User/lib -ldl -framework CoreFoundation -lpython2.7 -u _PyMac_Error ~/Library/Enthought/C\ anopy_32bit/User/lib")

これにより、リンクされたライブラリを で調べると @rpath シンボル パスが生成さotoolれ、他の OSX システムの enthought/canopy で問題なく動作-lpythonするようです。システム python)

次のリンカ フラグを使用してシステム python に対してコンパイルする

set (CMAKE_SHARED_LINKER_FLAGS "-L /Library/Frameworks/Python.framework/Versions/Current/lib/python2.7/config -ldl -framework CoreFoundation -u _PyMac_Error /Library/Frameworks/Python.framework/Versions/Current/Python")

思考とシステム python で動作します

これらはどちらも、バンドルされた python とターゲット環境であるPsychopyで動作し、バンドルされた python に対してコンパイルすると、psychopy で動作しますが、他の python では動作しません。

4

1 に答える 1