【问题标题】:gcc fails to find reference to object in dynamic librarygcc 无法在动态库中找到对对象的引用
【发布时间】:2013-09-13 17:08:55
【问题描述】:

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

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

【问题讨论】:

  • 你忘记了 fft-test.c 中的#include 吗?
  • 绝对包括在内。但是,fft.h头文件玩了一些奇怪的游戏:#define FFT_NAME(x) x#define ff_fft_init FFT_NAME(ff_fft_init)int ff_fft_init(FFTContext *s, int nbits, int inverse);
  • 只是出于好奇,您为什么要将 PIC 用于您的二进制文件?当您链接到 .so 文件时,如果没有 -fPIC,链接器的行为是否会有所不同?
  • 最终实际调用这个fft共享库的代码也是共享库。 -fPIC 开关在这里没有任何作用。
  • 抱歉忘记@HonkyTonk 的最后一条评论

标签: c gcc linker


【解决方案1】:

我不确定这是一个答案,但它可能会对你有所帮助。

我写了一个最小的可编译示例:

#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

因此,我建议您尝试将现有代码精简到最少,并在编译时慢慢添加其余部分,看看它在哪里中断。

【讨论】:

  • 是的,这确实有帮助,但可能不是您所期望的。 ffmpeg代码没有这个问题。
猜你喜欢
  • 2017-09-25
  • 2021-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多