ffmpeg先编译静态库再编译动态链接库出现的异常问题解决

上次解决了编译ffplay异常的问题
这次要将ffmpeg的库用起来,不过编译动态库的时候遇到了点问题:
relocation R_X86_64_32 against `a local symbol’ can not be used when making a shared object; recompile with -fPIC

由于上次使用./configure默认配置,里面只编译了.a静态文件(可通过 ./configure --help 看到)。所以先把.so动态库也编译了。
推荐一开始配置./configure文件的时候就添加设置 --enable-shared。如:./configure --enable-shared --enable-ffplay

sudo make clean	//清除掉上一章编译的内容后重新安装
./configure --enable-shared --enable-ffplay
sudo make 
sudo make install

否则先编译静态库之后再添加动态库的编译会出现上面的错误:

是由于,只进行静态编译./configure生成的编译配置信息不会生成 -fPIC配置
解决:
可参考:https://blog.csdn.net/ssf1987/article/details/81118631

由于ffmpeg-3.4.2/使用gcc来编译静态依赖库,编译的中间文件都保存在了ffmpeg-3.4.2/ffbuild下面,所以需要进去编辑 config.mak。
1、修改配置信息中,使用gcc、g++编译器时的配置项:
在文件里的CFLAGS= 还有CPPFLAGS=之后增加 -fPIC。 之后编译

sudo make 
sudo make install

或者使用方法2,则不需要进去修改配置项,临时修改CFLAGS变量:
2、

CFLAGS="-O3 -fPIC" ./configure --enable-shared
sudo make 
sudo make install

之后就可以在你配置安装的目录下看到动态链接库了
在这里插入图片描述
下一章就可以把ffmpeg用起来了

在使用 ffmpeg 进行编译时,如果需要编译动态库并且动态库依赖静态库,可以通过以下步骤完成: 1. 下载 ffmpeg 源码,并解压缩到一个目录中。 2. 进入解压缩后的目录,执行以下命令: ``` ./configure --enable-shared --disable-static ``` 这个命令将会编译出动态库,并禁用静态库。 3. 执行 `make` 命令进行编译。 4. 编译完成后,可以在 `./lib` 目录下看到编译好的动态库文件,例如 `libavcodec.so`、`libavformat.so` 等。 5. 如果需要在编译其他程序时链接这些动态库,需要添加 `-L` 和 `-l` 选项,例如: ``` gcc main.c -L./lib -lavcodec -lavformat -lavutil -o myapp ``` 这个命令将会链接 `libavcodec.so`、`libavformat.so` 和 `libavutil.so` 三个动态库,并生成可执行文件 `myapp`。 6. 如果这些动态库依赖静态库,需要在链接时添加 `-Wl,-Bstatic` 和 `-Wl,-Bdynamic` 选项,例如: ``` gcc main.c -L./lib -Wl,-Bstatic -lavcodec_static -lavformat_static -lavutil_static -Wl,-Bdynamic -o myapp ``` 这个命令将会链接 `libavcodec.a`、`libavformat.a` 和 `libavutil.a` 三个静态库作为动态库的依赖,并生成可执行文件 `myapp`。 注意:在链接动态库时,如果依赖的静态库不存在,或者版本不兼容,可能会导致链接失败。因此,建议在编译时尽量使用同一版本的静态库和动态库。同时,如果静态库和动态库都存在,建议优使用动态库,以减小可执行文件的体积。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值