我试图在我的ARM Ubuntu机器上重新安装我的ffmpeg,在这个guide之后。不幸的是,当我编译一个使用这个库的程序时,我得到了下面的失败:
/usr/bin/ld: /usr/local/lib/libavcodec.a(amrnbdec.o): relocation R_ARM_MOVW_ABS_NC against `a local symbol' can not be used when making a shared object; recompile with -fPIC
/usr/local/lib/libavcodec.a: could not read symbols: Bad value
collect2: ld returned 1 exit status
现在我想像编译器建议的那样用-fPIC
重新编译它,但是我不知道怎么做。任何帮助都是感激的。
9条答案
按热度按时间hpxqektj1#
简单地说,这个错误意味着你 * 不能使用一个静态库来链接一个动态库 *。正确的方法是将一个
libavcodec
编译成一个.so
而不是.a
,这样你试图构建的另一个.so
库就可以很好地链接。最简单的方法就是在
./configure
选项中添加--enable-shared
,或者你可以尝试完全禁用共享(或静态)库...你可以选择适合你的!niwlg2el2#
请查看this page.
您可以尝试使用以下命令全局添加标志:
export CXXFLAGS="$CXXFLAGS -fPIC"
9w11ddsr3#
在configure步骤之后,你可能有一个makefile。在这个makefile中,在末尾查找CFLAGS(或类似的). puf -fPIC,然后再次运行make。换句话说,-fPIC是一个编译器选项,必须传递给编译器的某个地方。
lrpiutwd4#
我在为Android x86_64目标平台构建FFMPEG静态库(例如libavcodec. a)时遇到了这个问题(使用Android NDK clang)。当与我的库静态链接时,尽管所有FFMPEG C-〉目标文件(*. o)都使用-fPIC编译选项编译,但仍出现了这个问题:
仅libavcodec. a和libswscale. a出现此问题。
此问题的根源是FFMPEG具有针对x86 * 平台的汇编程序优化,例如,报告的问题原因位于libavcodec/h264_qpel_10bit.asm-〉h264_qpel_10bit.o。
当生成X86 - 64位静态库(例如libavcodec. a)时,它看起来像汇编程序文件(例如libavcodec/h264_qpel_10bit.asm)使用了一些x86(32位)汇编程序命令,这些命令在与x86 - 64位目标库静态链接时不兼容,因为它们不支持所需的重定位类型。
1.编译所有ffmpeg文件,不进行汇编程序优化(对于ffmpeg,这是配置选项:- -禁用-asm)
1.生成动态库(例如www.example.com)并在最终库中动态链接它们 libavcodec.so ) and link them in your final library dynamically
我选择了1),它解决了问题。
参考:https://tecnocode.co.uk/2014/10/01/dynamic-relocs-runtime-overflows-and-fpic/
tv6aics15#
如果您正在构建一个共享库,但需要使用static libavcodec添加链接器标志:
在cmake的情况下:
mefy6pfw6#
我尝试在Centos 7上安装Dashcast时遇到了同样的问题。修复方法是在x264 Makefile中的每个CFLAGS的末尾添加
-fPIC
。然后我必须为x264和ffmpeg运行make distclean
并重建。zpgglvta7#
除了这里的好答案,特别是罗伯特·卢乔的。
我想说的是,在我的例子中,我一直在有意地尝试静态编译ffmpeg的一个版本,所有必需的依赖项和其他必需的东西,我都是静态编译的。
当我为ffmpeg进程运行
./configure
时,我没有注意到命令行上有--enable-shared
。只有删除它并运行./configure
,我才能够正确编译(一个ffmpeg二进制文件的所有56mbs)。如果您的意图是静态编译,也可以检查一下olqngx598#
我正在用gcc4.8.5在CentOS7上构建ffmpeg 5.1.2。
如**${ffmpegRoot}/doc/platform.texi**中所述:
1)配置选项
"--启用图片”
2)将以下选项添加到项目LDFLAGS中
"-Wl,-B符号”
jyztefdp9#
在编译之前,请确保“rules.mk“文件已正确包含在Makefile中,或通过以下方式显式包含该文件:
“来源rules.mk“