如何处理“使用 -fPIC 重新编译”消息

如何处理“使用 -fPIC 重新编译”消息

我正在尝试配置 ffmpeg 源包来构建 .so 文件而不是 .a 文件。

make做完后就跑./configure --enable-shared

这给了我以下信息:

/usr/bin/ld: libavutil/display.o: relocation R_X86_64_PC32 against undefined symbol 'hypot@@GLIBC_2.2.5' can not be used when making a shared object; recompile with -fPIC

但是,我不确定在哪里以及如何添加 -fPIC 标志。

答案1

有一个 ./configure 选项可能是解决问题的最简单方法:

andrew@ilium~/source/ffmpeg_build/ffmpeg/ffmpeg$ ./configure --help | grep -i pic
--enable-pic             build position-independent code

答案2

我已经解决了在 Ubuntu 14.04 LTS 上编译 FFMpeg 2.3.3 源代码时出现的相同错误。设置后,我成功编译了代码LD_LIBRARY_PATH/usr/lib/x86_64-linux-gnu并添加-fPIC标记为--cc。我的工作编译命令如下:

LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu
./configure --prefix=.. --enable-shared --enable-gpl --enable-version3 --enable-runtime-cpudetect --disable-outdev=sdl --disable-opencl --enable-libmp3lame --enable-libx264 --cc="gcc -m64 -fPIC" --extra-cflags="-I../include" --extra-ldflags="-L../lib -ldl"
make -j4

答案3

重定位 R_X86_64_PC32 指向未定义符号 ,通常发生在 LDFLAGS 设置了加固而 CFLAGS 没有设置时。
可能只是用户错误:
如果您在链接时使用 -specs=/usr/lib/rpm/redhat/redhat-hardened-ld ,您还需要在编译时使用 -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 ,并且由于您同时进行编译和链接,您需要两者,或者删除 -specs=/usr/lib/rpm/redhat/redhat-hardened-ld 。常见修复:
https://bugzilla.redhat.com/show_bug.cgi?id=1304277#c3
https://github.com/rpmfusion/lxdream/blob/master/lxdream-0.9.1-implicit.patch

相关内容