2010-11-19 31 views
0

私は、libpython.a(2.7)に静的リンクしているアプリケーションを持っています。アプリケーションのインタプリタの中から私が失敗しtimeモジュール(time.so)、インポートしてみてください:だからアプリケーションに埋め込まれたPythonインタプリタでネイティブモジュールが読み込まれない

ImportError: ./time.so: undefined symbol: PyExc_IOError 

を、このモジュールは、未解決のシンボルを持っています

nm -D time.so | grep PyExc_IOError 
     U PyExc_IOError 

私は、このシンボルは、リンカによって破棄されていることを考え出しアプリケーションをリンクするとき。 [OK]を、私は今、すべてのシンボルとlibpythonをリンクしています:

$ nm app | grep PyExc_IOError 
8638348 D PyExc_IOError 
08638ca0 d _PyExc_IOError 

しかし、私はまだ同じインポートエラーを取得:

... -Wl,-whole-archive -lpython -Wl,-no-whole-archive ... 

シンボルが今あります。問題はどこだ?

+0

埋め込みガイドの手順に従っていますか? distutilsでコンパイルしますか? –

+0

@Eli、うん、そこにあるよ。私のガット様の注意のスパンは、最後の段落までそれを作るのに十分ではありませんでした。 –

答えて

2

libpythonがすべてバイナリに含まれていることを確認するだけでなく、ライブラリ内のシンボルが共有オブジェクトに公開されていることを確認する必要があります。 libpython(静的)をメインのバイナリにリンクするとき、これは--export-dynamicリンカ引数が必要であることを意味します(-Wl,--export-dynamicまたは-Xlinker --export-dynamicをgcc引数として使用します)。これは、共有オブジェクトがRTLD_GLOBALフラグがdlopen()に設定されていることを確認する必要があることを意味します。

関連する問題