项目场景:
opencv为4.4版本,ffmpeg为4.2.2版本,平台为TX2,编译安装包含CUDA的opencv版本,并把ffmpeg联合编译进去。
问题描述
报错详细信息如下:
relocation R_AARCH64_ADR_PREL_PG_HI21 against symbol `ff_vp9_subpel_filters' which may bind externally can not be used when making a shared object; recompile with -fPIC
原因分析:
看报错像是变量定义有冲突,有一个变量定义了全局变量,导致定义冲突。于是编译时候把ffmpeg去掉了,不把他编译进去,再重新编译opencv,果然报错消失了。当然这只是解决问题的其中一个方法,但我想把ffmpeg编译进去,又想让报错消失,于是从ffmpeg的编译下手,ffmpeg的编译方法可以参考我的文章《opencv联合编译ffmpeg》,在编译ffmpeg前同样需要配置编译选项,正常情况下都是默认配置项,直接运行./configure命令即可,但这个地方报错了,必然需要对选项进行一些调整。那如何调整呢,网上搜了一些答案,和这个报错很相似,于是死马当活马医试了一把,参考文章《ffmpeg使用fPIC静态库》,居然通过了,就把解决方法贴出来给大家参考下。
解决方案:
在ffmepg执行配置命令时,加上一个配置选项,如下
./configure --enable-shared