【ffmpeg编译问题】recompile with -fPIC /usr/bin/ld: 最后的链结失败: 错误的值

安装流程参考
最新版本ffmpeg6.0源码安装+vscode开发环境搭建!

1、配置

下好ffmpeg后,设置配置

sudo ./configure --prefix=/usr/local/ffmpeg --enable-gpl --enable-shared --enable-version3 --enable-nonfree --enable-pthreads --enable-libx264 --enable-libx265 --enable-libfdk-aac --enable-pic

这些配置的作用如下:

  • –prefix=/usr/local/ffmpeg :设置安装到什么路径下。
    仅影响后续make install时,将编好的产物复制到什么路径下,主要包含so、a、头文件、可执行应用程序;以及make uninstall时,去哪里删除这些东西。
    如果缺省,则库文件安装到/usr/local/lib,头文件安装到/usr/local/include,可执行应用程序安装到/usr/local/bin

  • –enable-shared:构建共享库(默认关闭),编译安装完,才会有.so动态链接库文件;

在这里插入图片描述

不开启的话,只会有.a静态链接库文件
在这里插入图片描述

  • libx264、libx265、libfdk-aac都是第三方库
  • –enable-gpl:允许使用GPL(默认关闭)想要使用这些第三方库,则需要开启
  • –enable-version3:升级GPL到版本3(默认关闭)
  • –enable-nonfree:允许使用非免费的代码,产生的库和二进制程序将是不可再发行的(默认关闭)
  • –enable-pthreads:启用pthreads多线程(默认关闭)

2、编译

sudo make -j

最后一步遇到问题

/usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib/libfdk-aac.a(genericStds.o): relocation R_X86_64_PC32 against symbol `stdout@@GLIBC_2.2.5' can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: 最后的链结失败: 错误的值
collect2: error: ld returned 1 exit status
ffbuild/library.mak:118: recipe for target 'libavcodec/libavcodec.so.60' failed
make: *** [libavcodec/libavcodec.so.60] Error 1

参考了很多资料,均未能解决,各家有各种错误
ffmpeg编译错误问题,.rodata’ can not be used when making a shared object; recompile with -fPIC
编译时出现: can not be used when making a shared object 和fPIC
make报错:relocation R_X86_64_PC32 against symbol `stderr@@GLIBC_2.2.5‘
ffmpeg使用fPIC静态库解决记录
编译ffmpeg出错 recompile with -fPIC
但是大概得出结论,可能是编译静态库动态库混用的问题。自己的编译已经通过了,就是链接时,其他库有问题。

尝试解决

方案1,重编fdk-aac

从报错打印来看,就是libfdk-aac.a这个有问题。首先看他路径对不对,我们的ffmpeg指定了安装到/usr/local/ffmpeg下,但是这个引用好像在/usr/lib/libfdk-aac.a,这个路径是从fdk-aac.pc中获取到的。可能是我们编fdk-aac时没有指定路径,装的地方不对;也可能是环境变量第一顺位是这里,就已经找到fdk-aac.pc文件;反正就它有问题
在这里插入图片描述
简单重编了fdk-aac之后,到ffmpeg还是报这个错
有人说是这个东西没有开启动态库编译,并且开了的话要开-fPIC。看了一下,编fdk-aac时./configure设置了–enable-shared,同时设置了CPPFLAGS=“-fPIC”,也一样到ffmpeg时报错

方案2,ffmpeg不编第三方库

就是只使用

sudo ./configure --prefix=/usr/local/ffmpeg --enable-shared --enable-nonfree --enable-pthreads --enable-pic

直接编过了。但是不行啊,得用啊。

方案3,ffmpeg不编动态库

就是不启用–enable-shared,这样也能编过,但是只有.a文件,肯定也不行
此时基本确认是动态库问题

方案4,在路径下发现没有fdk-aac的so文件

具体原因大概是因为编ffmpeg的动态库文件需要依赖fdk-aac的动态库文件,我们装的fdk-aac在/usr/local/ffmpeg下,由于安装时是从环境变量中获取fdk-aac的pc文件去取得库地址,我们装的fdk-aac在第二顺位环境变量下。
可能是ffmpeg写死路径的问题,也可能是系统自带fdk-aac且处于/usr/lib下,/usr/lib下的fdk-aac没有动态库文件。

  • 从我们自己装的路径下,复制一个so到ffmpeg需要的路径/usr/lib下,再安装,就正常了

3、可以安装了

sudo make install

装完可以在我们指定的路径下,看到可执行文件、库文件和头文件了

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值