私はffmpegを再インストールしようとしていましたが、この guide をARM Ubuntuマシンで。残念ながら、このlibを使用するプログラムをコンパイルすると、次のエラーが発生します。 :
/usr/bin/ld: /usr/local/lib/libavcodec.a(amrnbdec.o): relocation R_ARM_MOVW_ABS_NC against `a local symbol' can not be used when making a shared object; recompile with -fPIC
/usr/local/lib/libavcodec.a: could not read symbols: Bad value
collect2: ld returned 1 exit status
今、私はコンパイラが示唆しているように-fPIC
でそれを再コンパイルしたいと思いますが、どうすればいいのか分かりません。どんな助けも大歓迎です。
簡単に言うと、エラーは動的ライブラリとリンクする静的ライブラリを使用できないを意味します。正しい方法は、libavcodecを.aではなく.soにコンパイルすることです。そのため、構築しようとしている他の.soライブラリもリンクできます。
そうする最も簡単な方法は、--enable-shared
at ./configure
オプション。または、共有(または静的)ライブラリを完全に無効にしようとすることもあります...最適なものを選択します。
このページ をご覧ください
次を使用してフラグをグローバルに追加してみてください:export CXXFLAGS="$CXXFLAGS -fPIC"
構成手順の後、おそらくメイクファイルがあります。このメイクファイル内でCFLAGS(または同様の)を探します。最後にpuf -fPICを実行し、makeを再度実行します。つまり、-fPICはコンパイラオプションであり、コンパイラのどこかに渡す必要があります。
Centos 7にDashcastをインストールしようとすると、この同じ問題にぶつかりました。修正は、x264 Makefileの各CFLAGSの最後に-fPIC
を追加することでした。それから、x264とffmpegの両方に対してmake distclean
を実行し、再構築する必要がありました。
Android x86_64ターゲットプラットフォーム(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(32ビット)アセンブラーコマンドを使用します。 -64ビットターゲットライブラリ。必要な再配置タイプをサポートしていないためです。
可能な解決策:
1)を選択し、問題を解決しました。
参考: https://tecnocode.co.uk/2014/10/01/dynamic-relocs-runtime-overflows-and-fpic/