gcc在动态库中找不到对对象的引用
我正在尝试使用libav库中的FFT代码。由于代码是LGPL,我需要将其链接为动态库,但链接器似乎无法解析某些符号:gcc在动态库中找不到对对象的引用,c,gcc,linker,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:li
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
我尝试在link命令中交换库的顺序,并使用-Wl、-start group
和-Wl、-end group
选项。不走运
那么我在这里错过了什么?有什么想法吗?我不确定这是否是一个答案,但它可能会帮助你 我写了一个最小的可编译示例:
#include <libavcodec/fft.h>
int main(int argc, int* argv[]) {
ff_fft_init(NULL, 0, 0);
return 0;
}
因此,我建议尝试将现有代码精简到最低限度,在编译时,慢慢地一块一块地添加其余的代码,看看它在哪里中断。您是否忘记了#include in fft test.c?肯定包括在内。然而,fft.h头文件玩了一些奇怪的游戏:
#定义fft_名称(x)x
#定义ff_fft_init fft_名称(ff_fft_init)
int ff_fft_init(FFTContext*s,int-nbits,int-inverse)只是出于好奇,你为什么想要你的二进制图片?当您针对.so文件进行链接时,如果没有-fPIC
,链接器的行为是否会有所不同?最终,实际调用此fft共享库的代码也是一个共享库。-fPIC开关在这里没有任何作用。很抱歉,最后的评论中忘记了@HonkyTonk。是的,这确实有帮助,但可能不是您所期望的。ffmpeg代码没有这个问题。
$ ls -al fft_test
-rwxrwxr-x. 1 foo foo 451859 Sep 14 10:49 fft_test