70

このガイドに従って、ARMUbuntuマシンにffmpegを再インストールしようとしました。残念ながら、この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コンパイラが提案しているように再コンパイルしたいのですが、どうすればいいのかわかりません。どんな助けでも大歓迎です。

4

8 に答える 8

81

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

これを行う最短の方法は、オプションで追加すること--enable-sharedです./configure。または、共有(または静的)ライブラリをまったく無効にしようとする場合もあります...自分に適したものを選択してください!

于 2012-12-11T01:47:36.737 に答える
25

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

次を使用して、フラグをグローバルに追加してみることができます。export CXXFLAGS="$CXXFLAGS -fPIC"

于 2012-12-11T01:39:06.867 に答える
7

構成ステップの後、おそらくmakefileがあります。このmakefile内で、CFLAGS(または同様のもの)を探します。最後にpuf-fPICを実行し、makeを再度実行します。言い換えると、-fPICはコンパイラオプションであり、どこかでコンパイラに渡す必要があります。

于 2012-12-11T01:36:31.977 に答える
5

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ビット)アセンブラコマンドを使用するように見えます必要な再配置タイプをサポートしていません。

考えられる解決策

  1. アセンブラーを最適化せずにすべてのffmpegファイルをコンパイルします(ffmpegの場合、これは構成オプションです:--disable-asm)
  2. ダイナミックライブラリ(例:libavcodec.so)を作成し、それらを最終的なライブラリに動的にリンクします

私は1)を選びました、そしてそれは問題を解決しました。

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

于 2019-08-29T10:09:00.150 に答える
2

共有ライブラリを構築しているが、静的libavcodecとリンクする必要がある場合は、リンカーフラグを追加します。

-Wl,-Bsymbolic

cmakeの場合:

set(CMAKE_SHARED_LINKER_FLAGS "-Wl,-Bsymbolic")
于 2021-07-15T13:20:38.567 に答える
1

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

于 2019-05-02T13:20:48.267 に答える
0

ここでの良い答えに加えて、特にロバート・ルホのもの。

私の場合、ffmpegのバージョンを静的にコンパイルしようと意図的に試みてきました。必要なすべての依存関係とこれまでに必要だったものはすべて、静的コンパイルを実行しました。

./configureffmpegプロセスを実行したとき--enable-shared、コマンドラインにあることに気づきませんでした。それを削除して実行する./configureのは、正しくコンパイルできたときだけです(ffmpegバイナリの56 mbすべて)。静的コンパイルを意図している場合は、それも確認してください

于 2020-06-20T00:26:09.777 に答える
-1

コンパイルする前に、「rules.mk」ファイルがMakefileに正しく含まれていることを確認するか、次の方法で明示的に含めてください。

「ソースrules.mk」

于 2015-11-26T05:13:55.977 に答える