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.pswp.cn/news/540767.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/540767.shtml
英文地址,請注明出處:http://en.pswp.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…