2011-01-22 13 views
4

PythonモジュールをロードするAudacious Media Playerのプラグインを作成しようとしています。 Python埋め込みコードは、python-2.6ソース(埋め込み/デモ)からのものです。これは私がCCの引数に-lpython2.6 -lm -L/usr/lib/python2.6/configを追加PythonをCに埋め込む、未定義のシンボル:PyExc_ImportError

gcc -o demo demo.c -lpython2.6 -lm -L/usr/lib/python2.6/config

、コマンドラインでコンパイルします。

そして、pygtkgtkモジュールをインポートするPythonスクリプトを読み込みますが、これはうまくいきます。

しかし、私は、プラグイン(共有ライブラリ)をコンパイルした後、次のエラーが(私が見つけたとして、これはgtkに特異的でない、それはネイティブライブラリを使用するすべてのpythonモジュールに同じです)

Traceback (most recent call last): 
    File "<string>", line 1, in <module> 
    File "./xyz.py", line 7, in <module> 
    import gtk 
    File "/usr/lib/pymodules/python2.6/gtk-2.0/gtk/__init__.py", line 30, in <module> 
    import gobject as _gobject 
    File "/usr/lib/pymodules/python2.6/gtk-2.0/gobject/__init__.py", line 26, in <module> 
    from glib import spawn_async, idle_add, timeout_add, timeout_add_seconds, \ 
    File "/usr/lib/pymodules/python2.6/gtk-2.0/glib/__init__.py", line 22, in <module> 
    from glib._glib import * 
ImportError: /usr/lib/libpyglib-2.0-python2.6.so.0: undefined symbol: PyExc_ImportError 
を発生

Pythonインタプリタを設定するためのCコードには、PySys_SetArgv呼び出しが不足しています。私はそれを偽造しようとしましたが、同じエラーが発生しました!

答えて

2

Linuxを使用していると仮定して、-Xlinker -export-dynamicをコンパイラ行に追加する必要があります。これにより、実行可能ファイルで定義されたシンボルが拡張モジュールで使用できるようになります。

他のプラットフォームでは、LINKFORSHAREDがPythonのmakefileに設定されているかどうかを確認し、同じフラグを使用してください。

+0

http://pastebin.com/raw.php?i=PXZuhQE3これは私が使用しているメークファイルです。私はそれを試しましたが、それは問題を解決しませんでした。答えをありがとう! – madura

+0

@ madura: 'song_change.so'にはそのオプションを使わないでください。代わりに 'デモ'をリンクするためにそれを使用してください。 –

+0

http://pastebin.com/GS9uegjSまだ動作しません – madura

1

Windowsで64ビットのPythonを使用していますか? 64ビットpython26.Libには、32ビットのPythonで利用可能ないくつかのシンボルがありません。 32ビットのPythonを試してみて、問題を解決する必要があります。

関連する問題