我正在尝试使用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
选项。没有运气。
那我在这里错过了什么?有什么想法吗?
答案 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
所以,我建议你尝试将你现有的代码修改为最小的代码,当你编译它时,慢慢地逐个添加剩下的代码以查看它的中断位置。