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-groupand-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 回答