0

libav ライブラリの FFT コードを使用しようとしています。コードは LGPL であるため、動的ライブラリとしてリンクする必要がありますが、リンカーはいくつかのシンボルを解決できないようです:

gcc -g -fPIC fft-test.c -I. -L. -lavutil -lavcodec -lm -o fft_test

次のエラーが表示されます。

fft-test.c:319: undefined reference to `ff_fft_init'

ただし、ライブラリの .a バージョンとのリンクは正常に機能します。

gcc -g -fPIC fft-test.c -I. -L. -lavutil -l:libavcodec.a -lm -o fft_test

libavcodec.so ファイルの objdump は、ff_fft_init が定義されていることを示しています。

000000000002f146 l     F .text  0000000000000229              ff_fft_init

.a バージョンの objdump も問題ないようです。

00000000000000ed g     F .text.unlikely 0000000000000229 ff_fft_init

リンク コマンドでライブラリの順序を入れ替えたり、オプション-Wl,--start-group-Wl,--end-groupオプションを使用したりしてみました。運がない。

それで、私はここで何が欠けていますか?何か案は?

4

1 に答える 1

0

これが答えかどうかはわかりませんが、役立つかもしれません。

私は最小限のコンパイル可能な例を書きました:

#include <libavcodec/fft.h>

int main(int argc, int* argv[]) {
  ff_fft_init(NULL, 0, 0);

  return 0;
}

そして、新しくコンパイルされたffmpeg-2.0.1ソース コード バンドルのルート フォルダーでコンパイルします。

$ gcc fft-test.c -I. -Llibavcodec -Llibavutil -lavcodec -lavutil -lm -o fft_test

そして、期待どおりに機能します。

$ ls -al fft_test 
-rwxrwxr-x. 1 foo foo 451859 Sep 14 10:49 fft_test

したがって、既存のコードを最小限のものに切り詰め、コンパイルが完了したら、残りの部分を少しずつ追加して、どこが壊れているかを確認することをお勧めします。

于 2013-09-14T08:56:33.170 に答える