web-dev-qa-db-ja.com

-fPICで再コンパイルする方法

私は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でそれを再コンパイルしたいと思いますが、どうすればいいのか分かりません。どんな助けも大歓迎です。

55
user1455085

簡単に言うと、エラーは動的ライブラリとリンクする静的ライブラリを使用できないを意味します。正しい方法は、libavcodecを.aではなく.soにコンパイルすることです。そのため、構築しようとしている他の.soライブラリもリンクできます。

そうする最も簡単な方法は、--enable-shared at ./configureオプション。または、共有(または静的)ライブラリを完全に無効にしようとすることもあります...最適なものを選択します。

61
zaufi

このページ をご覧ください

次を使用してフラグをグローバルに追加してみてください:export CXXFLAGS="$CXXFLAGS -fPIC"

15
Kraiden

構成手順の後、おそらくメイクファイルがあります。このメイクファイル内でCFLAGS(または同様の)を探します。最後にpuf -fPICを実行し、makeを再度実行します。つまり、-fPICはコンパイラオプションであり、コンパイラのどこかに渡す必要があります。

6
dmaij

Centos 7にDashcastをインストールしようとすると、この同じ問題にぶつかりました。修正は、x264 Makefileの各CFLAGSの最後に-fPICを追加することでした。それから、x264とffmpegの両方に対してmake distcleanを実行し、再構築する必要がありました。

1
Tony Pavick

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. アセンブラーの最適化なしですべてのffmpegファイルをコンパイルします(ffmpegの場合、これは構成オプションです--disable-asm)
  2. 動的ライブラリ(libavcodec.soなど)を作成し、最終ライブラリで動的にリンクします

1)を選択し、問題を解決しました。

参考: https://tecnocode.co.uk/2014/10/01/dynamic-relocs-runtime-overflows-and-fpic/

0
Robert Lujo