【发布时间】: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 的最后一条评论