Android x86_64ターゲットプラットフォーム用のFFMPEG静的ライブラリ(例:libavcodec.a)をビルドするときにこの問題が発生しました(Android NDK clangを使用)。私のライブラリと静的にリンクすると、すべてのFFMPEG C->オブジェクトファイル(* .o)が-fPICコンパイルオプションでコンパイルされたにもかかわらず、問題が発生しました。
x86_64/libavcodec.a(h264_qpel_10bit.o):
requires dynamic R_X86_64_PC32 reloc against 'ff_pw_1023'
which may overflow at runtime; recompile with -fPIC
この問題は、libavcodec.aとlibswscale.aでのみ発生しました。
この問題の原因は、FFMPEGがx86 *プラットフォーム用にアセンブラーを最適化したことです。たとえば、報告された問題の原因はlibavcodec /h264_qpel_10bit.asm->h264_qpel_10bit.oにあります。
X86-64ビット静的ライブラリ(例:libavcodec.a)を作成する場合、アセンブラファイル(例:libavcodec / h264_qpel_10bit.asm)は、x86-64ビットターゲットライブラリと静的にリンクするときに互換性のないいくつかのx86(32ビット)アセンブラコマンドを使用するように見えます。必要な再配置タイプをサポートしていません。
考えられる解決策:
- アセンブラーを最適化せずにすべてのffmpegファイルをコンパイルします(ffmpegの場合、これは構成オプションです:--disable-asm)
- ダイナミックライブラリ(例:libavcodec.so)を作成し、それらを最終的なライブラリに動的にリンクします
私は1)を選びました、そしてそれは問題を解決しました。
参照:https ://tecnocode.co.uk/2014/10/01/dynamic-relocs-runtime-overflows-and-fpic/