2

私はPython Cモジュールを作成しました(ffmpeg.cこれは、いくつかのFFmpegライブラリと他のライブラリに依存しています)。リンク方法を知りたいです。

私はコンパイルしています:

cc -std=c99 -c ../ffmpeg.c -I /usr/include/python2.7 -g

私は今、次のものとリンクしようとしています:

ld -shared -o ../ffmpeg.so -L/usr/local/lib -lpython2.7 -lavutil -lavformat -lavcodec -lswresample -lportaudio -lchromaprint ffmpeg.o -lc

エラーはありません。ただし、import ffmpegPython で実行しようとすると、次のようになります。

ImportError: ./ffmpeg.so: undefined symbol: avio_alloc_context


多分これはすでに正しいです。ffmpeg.soで結果を確認したlddところ、部分的に間違ったFFmpegにリンクしています。-L/usr/local/libただし、これはデフォルトよりも優先されるため、奇妙です。たぶん、カスタム インストールされた FFmpeg (in /usr/local/lib) には、何らかの理由で静的*.aライブラリのみがインストールされており、*.soファイルがファイルよりも優先されるため*.aです。

4

1 に答える 1

0

ファイルのにリンク先のライブラリを配置する必要があります。.oすなわち:

ld -shared -o ../ffmpeg.so ffmpeg.o -L/usr/local/lib -lpython2.7 -lavutil -lavformat -lavcodec -lswresample -lportaudio -lchromaprint -lc

avio_alloc_contextリンカはばかげており、依存関係が発生するまで必要でないと思われる静的ライブラリからのコードにリンクしませffmpeg.oん。ライブラリ内のコードを必要に応じて考慮して、リンクされないようにします。これが、.aファイルを使用したリンクが失敗する最大の理由です。

--start-groupリンクしているすべてのファイルを使用することも--end-groupできます。これにより、他の方法では解決できないように見える相互依存関係を持つ静的ライブラリをリンクできます。

ld -shared -o ../ffmpeg.so -L/usr/local/lib -lpython2.7 --start-group -lavutil -lavformat -lavcodec -lswresample -lportaudio -lchromaprint ffmpeg.o --end-group -lc

ファイルを使用.aするのはファイルよりも少しトリッキー.soですが、これら 2 つの項目は通常、リンク時に発生する問題を回避します。

于 2012-09-29T13:30:16.553 に答える