ffmpeg 纯静态编译,以及添加自定义库流程摘要

需求:

1. 纯静态编译ffmpeg ,即ldd ./ffmpeg 的结果是:not a dynamic executable
2.  修改ffmpeg 项目,添加自定义功能库
3. 自定义库由c++实现,要求能被纯c的ffmpeg项目调用
4. 自定义库必须使用g++ 的一些高级特性编译,要求g++支持c++11
5. 自定义库使用了pthread库 和openmp 库
6. 自定义库使用了opencv 3.0.0库,
7. 禁用所有的图形显示库x11,xcb,声音设备avdevice等等,静态链接这些库,会很痛苦。
动手之前需要注意:
A. ffmpeg.org (CentOS或 Ubuntu)的方法是不能达到需求1的,因为它大量使用包管理软件(yum 或apt-get)安装一些ffmpeg的依赖库,而这些依赖库大多是动态版本(.so.*) 。这就使得编译ffmpeg时,无法静态链接这些依赖库。因而,非开发工具(如gcc g++ pkg-config aotoconf etc )的依赖库(如ass,freetype,sdl theora, jpeg png,etc),需要手动下载它们的源码(以及这些依赖库的依赖库),然后编译得到静态库(.a)。一般来说,这些依赖库多数是configure 配置,然后make,make install。
./configure *** --enable-shared=no --enable-static=yes --with-***=/dir
B.自定义功能库也类似于上述方法写好myfunc.cpp,然后g++编译,ar打包成.a。但是由于我们写好的cpp要求c++11特性,而CentOS6.5上的gcc/g++版本为4.4.7不支持c++11。因而,需要安装gcc4.8以上版本。从repo里面无法安装较新的gcc的话,只能自行下载gcc源码,自行编译了。然而发现了一个第三方的编译好的工具链devtool3,它提供了gcc 4.9.2 以及配套的binutils工具。然而,不要急,先不要安装它,看完本注意事项。
C.要求c++打包的库能够被ffmpeg的项目链接,要求libstdc++.a (-lstdc++);能够使用openmp,要求libgomp.a ( -fopenmp); libstdc++.a可以通过yum install libstdc++-static得到,但是libgomp.a则没有对应的方法。
综合B和C的注意事项,我们应该自行编译gcc,而不是使用系统自带的gcc或者yum apt-get下载安装的,因为自行编译gcc能够直接得到libstdc++.a和libgomp.a这些静态库。我选用的版本是gcc4.8.4,同样地配置它编译出静态库。配套的Binutils也需要重新编译。
D. glibc是GNU的标准C库实现,如果要静态链接glibc这些底层的库_——libc.a,libm.a,librt.a,libdl.a,libpthread.a ,需要安装glibc的静态版本
#yum install glibc-static, 
#whereis libc.a(找到路径)
#cp 路径/libc.a ~mydir/(其它4个库类似,重新拷贝到一个新的位置,以防链接时优先选择动态链接,当然把这个路径放在LDFLAGS最前面)
E.opencv 和ffmpeg在配置阶段(分别使用cmake和configure),务必关闭所有的与图形IO相关的依赖,因为图形库的静态版本,太难找了,依赖关系特别冗长繁杂。
F. 最终链接ffmpeg时候,由于ffmpeg依赖了一些库如x264,x265,freetype等,它们各自依赖了glibc的一些库如librt,libm,libc,libdl。因而原始命令(#make -n|grep ffmpeg_g)中glibc的一些库(libm,libc,librt,libdl,libpthread)被反复调用,分布于多个地方,如下:
gcc  -Llibavcodec -Llibavdevice -Llibavfilter -Llibavformat -Llibavresample -Llibavutil -Llibpostproc -Llibswscale -Llibswresample -L/home/ffmpeg/ffmpeg_sjtu/lib  -Wl,--as-needed -Wl,-z,noexecstack -Wl,--warn-common -Wl,-rpath-link=libpostproc:libswresample:libswscale:libavfilter:libavdevice:libavformat:libavcodec:libavutil:libavresample   -o ffmpeg_g cmdutils.o ffmpeg_opt.o ffmpeg_filter.o ffmpeg.o   -lavdevice -lavfilter -lavformat -lavcodec -lpostproc -lswresample -lswscale -lavutil  -L/home/ffmpeg/ffmpeg_build/lib -lx265 -lstdc++-lm -lrt -ldl -L/home/ffmpeg/ffmpeg_build/lib -lx264 -lpthread -lm -ldl -L/home/ffmpeg/ffmpeg_build/lib -lvpx -lm -lpthread -L/home/ffmpeg/ffmpeg_build/lib -lvpx -lm -lpthread -L/home/ffmpeg/ffmpeg_build/lib -lvpx -lm -lpthread -L/home/ffmpeg/ffmpeg_build/lib -lvpx -lm -lpthread -ltheoraenc -ltheoradec -logg -L/home/ffmpeg/ffmpeg_build/lib -lopus -lm -lmp3lame -L/home/ffmpeg/ffmpeg_build/lib -lfribidi -L/home/ffmpeg/ffmpeg_build/lib -lfreetype -lz -L/home/ffmpeg/ffmpeg_build/lib -lfontconfig -lxml2 -llzma -lm -lfreetype -lz -L/home/ffmpeg/ffmpeg_build/lib -lfdk-aac -lm -L/home/ffmpeg/ffmpeg_build/lib -lass -lharfbuzz -lfontconfig -lenca -lfribidi -lxml2 -llzma -lm -lfreetype -lz -lm -llzma -lbz2 -lz -pthread -lrt -lstdc++      -L/home/ffmpeg/sjtu_fruc/lib -lsjtu_fruc  -fopenmp   -L/usr/local/lib -L/usr/local/share/OpenCV/3rdparty/lib -lopencv_shape -lopencv_stitching -lopencv_objdetect -lopencv_superres -lopencv_videostab -lopencv_calib3d -lopencv_features2d -lopencv_highgui -lopencv_videoio -lopencv_imgcodecs -lopencv_video -lopencv_photo -lopencv_ml -lopencv_imgproc -lopencv_flann -lopencv_core -lopencv_hal -lzlib -llibjpeg -llibwebp -llibpng -llibtiff -llibjasper -ltbb -lippicv -lstdc++ -ldl -lm -lpthread -lrt   
因此,为了能够静态链接glibc的几个库,需要手动修改这条最终的链接命令:把所有glibc的库放到最后,以如下方式:
-lm -lrt -ldl  -lm -lpthread -lrt   -static -lc
 
注意,-static -lc (libc.a)必须放到最后(pthread之后),因为pthread和c库有函数重定义的冲突。
 
这条语句最终为:
printf "LD\t%s\n" ffmpeg_g; gcc  -Llibavcodec -Llibavdevice -Llibavfilter -Llibavformat -Llibavresample -Llibavutil -Llibpostproc -Llibswscale -Llibswresample -L/home/ffmpeg/ffmpeg_sjtu/lib  -Wl,--as-needed -Wl,-z,noexecstack -Wl,--warn-common -Wl,-rpath-link=libpostproc:libswresample:libswscale:libavfilter:libavdevice:libavformat:libavcodec:libavutil:libavresample   -o ffmpeg_g cmdutils.o ffmpeg_opt.o ffmpeg_filter.o ffmpeg.o   -lavdevice -lavfilter -lavformat -lavcodec -lpostproc -lswresample -lswscale -lavutil  -L/home/ffmpeg/ffmpeg_build/lib -lx265 -L/home/ffmpeg/ffmpeg_build/lib -lx264 -L/home/ffmpeg/ffmpeg_build/lib -lvpx  -L/home/ffmpeg/ffmpeg_build/lib -lvpx  -L/home/ffmpeg/ffmpeg_build/lib -lvpx  -L/home/ffmpeg/ffmpeg_build/lib -lvpx -ltheoraenc -ltheoradec -logg -L/home/ffmpeg/ffmpeg_build/lib -lopus -lmp3lame -L/home/ffmpeg/ffmpeg_build/lib -lfribidi -L/home/ffmpeg/ffmpeg_build/lib -lfreetype -lz -L/home/ffmpeg/ffmpeg_build/lib -lfontconfig -lxml2 -llzma -lfreetype -lz -L/home/ffmpeg/ffmpeg_build/lib -lfdk-aac -L/home/ffmpeg/ffmpeg_build/lib -lass -lharfbuzz -lfontconfig -lenca -lfribidi -lxml2 -llzma -lfreetype -lz  -llzma -lbz2 -lz   -L/home/ffmpeg/sjtu_fruc/lib -lsjtu_fruc  -fopenmp   -L/usr/local/lib -L/usr/local/share/OpenCV/3rdparty/lib -lopencv_shape -lopencv_stitching -lopencv_objdetect -lopencv_superres -lopencv_videostab -lopencv_calib3d -lopencv_features2d -lopencv_highgui -lopencv_videoio -lopencv_imgcodecs -lopencv_video -lopencv_photo -lopencv_ml -lopencv_imgproc -lopencv_flann -lopencv_core -lopencv_hal -lzlib -llibjpeg -llibwebp -llibpng -llibtiff -llibjasper -ltbb -lippicv -lstdc++ -lm -lrt -ldl  -lm -lpthread -lrt   -static -lc
尽管它执行会报出一些warnning,但是,不影响生成ffmpeg_g可执行文件。
然后执行,
#cp ffmpeg_g ffmpeg
#strip ffmpeg
即可
测试ffmpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/540767.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue ani_ANI的完整形式是什么?

vue aniANI:自动号码识别 (ANI: Automatic Number Identification) ANI is an abbreviation of "Automatic number identification". ANI是“自动号码识别”的缩写 。 It is an attribute of a network of telecommunications for involuntarily finding…

realme系统服务器代码,解锁BL之后,Realme正式开放源代码

集微网8月30日消息(文/数码控),此前Realme已经开放了解锁BootLoader(简称BL),现在官方更进一步,直接将Realme X、Realme X青春版的源代码开放了。可能有的人不知道解锁BL与开放源代码是什么意思,我们在此来说明一下:Bo…

Codeforces 757B - Bash's Big Day(分解因子+hashing)

757B - Bashs Big Day 思路&#xff1a;筛法。将所有因子个数求出&#xff0c;答案就是最大的因子个数&#xff0c;注意全为1的特殊情况。 代码&#xff1a; #include<bits/stdc.h> using namespace std; #define ll long long #define pb push_back const int N1e55; in…

JavaScript中的const

const (const) Like other programming languages, JavaScript also provide the feature to create constants, we can make any identifier as constant by using the "const". 与其他编程语言一样&#xff0c;JavaScript也提供了创建常量的功能&#xff0c;我们可…

无法从ftp服务器上复制文件格式,ftp服务器上复制不了文件格式

ftp服务器上复制不了文件格式 内容精选换一换本版本提供dump_data_conversion.pyc脚本&#xff0c;实现dump数据文件与numpy文件格式互转功能&#xff0c;具体命令行格式如下&#xff1a;-type&#xff1a;数据类型&#xff0c;必选参数 。参数值选项&#xff1a;quant&#xf…

华大基因茅矛:云计算让精准医疗走进生活

2016年是“十三五”的开局之年&#xff0c;也是中国医疗卫生行业的关键一年。现在看来&#xff0c;也会是医疗行业和以大数据为代表的信息技术相互融合发展之年。今年4月&#xff0c;国务院办公厅印发《深化医药卫生体制改革2016年重点工作任务》&#xff0c;其中不仅谈到了要加…

Python Pandas –操作

Pandas support very useful operations which are illustrated below, 熊猫支持非常有用的操作&#xff0c;如下所示&#xff0c; Consider the below dataFrame, 考虑下面的dataFrame&#xff0c; import numpy as npimport pandas as pddf pd.DataFrame({col1: [1, 2, 3,…

有道词典总显示无法连接服务器,有道词典无法联网提示网络已断开该怎么办

人们使用电脑时候最不想看到的事情之一就是上不了网了&#xff0c;无论是工作还是玩游戏时候都很不爽。电脑能正常上网&#xff0c;但是有道词典始终无法联网。这是怎么回事呢?下面一起看看!方法步骤1、我是win8的系统。有道词典无法联网后&#xff0c;我在网上查了一下方法&a…

ajax+lazyload时lazyload失效问题及解决

最近写公司的项目的时候遇到一个关于图片加载的问题&#xff0c;所做的页面是一个商城的商品列表页&#xff0c;其中需要显示商品图片&#xff0c;名称等信息&#xff0c;因为商品列表可能会很长&#xff0c;所以其中图片需要滑到可以显示的区域再进行加载。 首先我的图片加载插…

手游pubg mobile服务器正在维护,PUBG Mobile Download Failed怎么解决

《PUBG Mobile》国际服出现下载失败的情况&#xff0c;你将会收到“Download Failed”提示&#xff0c;你就需要按照下述的方法去解决该问题。注意&#xff1a;如果下载不了 请复制浏览器上的链接 https:/http://pic.81857.netownloads.gradle.orghttp://pic.81857.netistribut…

Python自动化运维之常用模块—logging

在现实生活中&#xff0c;记录日志非常重要。银行转账时会有转账记录&#xff1b;如果有出现什么问题&#xff0c;人们可以通过日志数据来搞清楚到底发生了什么。 对于系统开发、调试以及运行&#xff0c;记录日志都是同样的重要。如果没有日志记录&#xff0c;程序崩溃时你…

Sys.WORD_SIZE Julia中的常量

Julia| Sys.WORD_SIZE常数 (Julia | Sys.WORD_SIZE Constant) Sys.WORD_SIZE is a constant of the Int64 type in Julia programming language, it is used to get the standard word size of the current system. Sys.WORD_SIZE是Julia编程语言中Int64类型的常量&#xff0c;…

ftp服务器如何配置多个文件夹,ftp服务器如何配置多个文件夹

ftp服务器如何配置多个文件夹 内容精选换一换Model File:模型文件。单击右侧的文件夹图标&#xff0c;在后台服务器sample所在路径(工程目录/run/out/test_data/model)选择需要转化的模型对应的*.prototxt文件&#xff0c;并上传。Weight File:权重文件。请自行从https://obs-m…

scala 方法调用_Scala中的方法调用

scala 方法调用Scala方法调用 (Scala Method Invocation) Method invocation is the legal and correct technique to call a method in Scala programming language. The methods of a class are usually accessed by using two methods. 方法调用是用Scala编程语言调用方法的…

docker lnmp php

使用 Docker 构建 LNMP 环境https://segmentfault.com/a/1190000008833012Docker 快速上手指南https://segmentfault.com/a/1190000008822648#articleHeader44

根据分类id找出父类id

2019独角兽企业重金招聘Python工程师标准>>> 数组格式要求 id > pid $columns [ 1 > 0, 10 > 1, 200 > 10 ]; public function getP($columns,$pid) { 模拟 $pid 200; $arr $columns; while($arr[$pid]) { …

不稳定学习器适合做基分类器_分类稳定性

不稳定学习器适合做基分类器什么是分类&#xff1f; (What is sorting?) It means to arrange data elements in increasing or decreasing order. There are many algorithms to do so like mergesort, quicksort, counting sort etc but there are pros and cons of each al…

JavaScript基础学习--05自定义属性、索引值

Demos&#xff1a; https://github.com/jiangheyan/JavaScriptBase 一、自定义属性1、读写操作<input abc"123" type"button" value"按钮" />//读写&#xff1a; var aBtn document.getElementsByTagName(input); aBtn[0].abc 456; 2、…

有线电视pcr是什么意思_有线电视的完整形式是什么?

有线电视pcr是什么意思有线电视&#xff1a;社区访问电视 (CATV: Community Access Television) CATV is an abbreviation of "Community Access Television". CATV是“社区访问电视”的缩写 。 It is also known as Public Access Television, which is a type of …

桶分类 算法_桶分类算法

桶分类 算法桶分类 (Bucket Sort) Bucket sort is a sorting technique in which array is partitioned into the buckets. By this, each bucket will be sorted individually, by using some another sorting algorithm such as insertion sort. This sorting technique assu…