Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
gcc在动态库中找不到对对象的引用_C_Gcc_Linker - Fatal编程技术网

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

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

我正在尝试使用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
我尝试在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)-fPIC
,链接器的行为是否会有所不同?最终,实际调用此fft共享库的代码也是一个共享库。-fPIC开关在这里没有任何作用。很抱歉,最后的评论中忘记了@HonkyTonk。是的,这确实有帮助,但可能不是您所期望的。ffmpeg代码没有这个问题。
$ ls -al fft_test 
-rwxrwxr-x. 1 foo foo 451859 Sep 14 10:49 fft_test