gcc无法在动态库中找到对象的引用

时间:2013-09-13 17:08:55

标签: c gcc linker

我正在尝试使用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选项。没有运气。

那我在这里错过了什么?有什么想法吗?

1 个答案:

答案 0 :(得分: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

所以,我建议你尝试将你现有的代码修改为最小的代码,当你编译它时,慢慢地逐个添加剩下的代码以查看它的中断位置。

相关问题