ffmpeg 纯静态编译,以及添加自定义库流程摘要
生活随笔
收集整理的這篇文章主要介紹了
ffmpeg 纯静态编译,以及添加自定义库流程摘要
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
需求:
1. 純靜態(tài)編譯ffmpeg ,即ldd ./ffmpeg 的結(jié)果是:not a dynamic executable 2. ?修改ffmpeg 項(xiàng)目,添加自定義功能庫(kù) 3. 自定義庫(kù)由c++實(shí)現(xiàn),要求能被純c的ffmpeg項(xiàng)目調(diào)用 4. 自定義庫(kù)必須使用g++ 的一些高級(jí)特性編譯,要求g++支持c++11 5. 自定義庫(kù)使用了pthread庫(kù)?和openmp?庫(kù) 6. 自定義庫(kù)使用了opencv 3.0.0庫(kù), 7. 禁用所有的圖形顯示庫(kù)x11,xcb,聲音設(shè)備avdevice等等,靜態(tài)鏈接這些庫(kù),會(huì)很痛苦。 動(dòng)手之前需要注意: A.?ffmpeg.org (CentOS或?Ubuntu)的方法是不能達(dá)到需求1的,因?yàn)樗罅渴褂冒芾碥浖?yum 或apt-get)安裝一些ffmpeg的依賴(lài)庫(kù),而這些依賴(lài)庫(kù)大多是動(dòng)態(tài)版本(.so.*) 。這就使得編譯ffmpeg時(shí),無(wú)法靜態(tài)鏈接這些依賴(lài)庫(kù)。因而,非開(kāi)發(fā)工具(如gcc g++ pkg-config aotoconf etc )的依賴(lài)庫(kù)(如ass,freetype,sdl theora, jpeg png,etc),需要手動(dòng)下載它們的源碼(以及這些依賴(lài)庫(kù)的依賴(lài)庫(kù)),然后編譯得到靜態(tài)庫(kù)(.a)。一般來(lái)說(shuō),這些依賴(lài)庫(kù)多數(shù)是configure 配置,然后make,make install。 ./configure ***?--enable-shared=no --enable-static=yes?--with-***=/dir B.自定義功能庫(kù)也類(lèi)似于上述方法寫(xiě)好myfunc.cpp,然后g++編譯,ar打包成.a。但是由于我們寫(xiě)好的cpp要求c++11特性,而CentOS6.5上的gcc/g++版本為4.4.7不支持c++11。因而,需要安裝gcc4.8以上版本。從repo里面無(wú)法安裝較新的gcc的話(huà),只能自行下載gcc源碼,自行編譯了。然而發(fā)現(xiàn)了一個(gè)第三方的編譯好的工具鏈devtool3,它提供了gcc 4.9.2 以及配套的binutils工具。然而,不要急,先不要安裝它,看完本注意事項(xiàng)。 C.要求c++打包的庫(kù)能夠被ffmpeg的項(xiàng)目鏈接,要求libstdc++.a (-lstdc++);能夠使用openmp,要求libgomp.a ( -fopenmp); libstdc++.a可以通過(guò)yum install libstdc++-static得到,但是libgomp.a則沒(méi)有對(duì)應(yīng)的方法。 綜合B和C的注意事項(xiàng),我們應(yīng)該自行編譯gcc,而不是使用系統(tǒng)自帶的gcc或者yum apt-get下載安裝的,因?yàn)樽孕芯幾ggcc能夠直接得到libstdc++.a和libgomp.a這些靜態(tài)庫(kù)。我選用的版本是gcc4.8.4,同樣地配置它編譯出靜態(tài)庫(kù)。配套的Binutils也需要重新編譯。 D. glibc是GNU的標(biāo)準(zhǔn)C庫(kù)實(shí)現(xiàn),如果要靜態(tài)鏈接glibc這些底層的庫(kù)_——libc.a,libm.a,librt.a,libdl.a,libpthread.a ,需要安裝glibc的靜態(tài)版本 #yum install glibc-static,? #whereis libc.a(找到路徑) #cp 路徑/libc.a ~mydir/(其它4個(gè)庫(kù)類(lèi)似,重新拷貝到一個(gè)新的位置,以防鏈接時(shí)優(yōu)先選擇動(dòng)態(tài)鏈接,當(dāng)然把這個(gè)路徑放在LDFLAGS最前面) E.opencv 和ffmpeg在配置階段(分別使用cmake和configure),務(wù)必關(guān)閉所有的與圖形IO相關(guān)的依賴(lài),因?yàn)閳D形庫(kù)的靜態(tài)版本,太難找了,依賴(lài)關(guān)系特別冗長(zhǎng)繁雜。 F. 最終鏈接ffmpeg時(shí)候,由于ffmpeg依賴(lài)了一些庫(kù)如x264,x265,freetype等,它們各自依賴(lài)了glibc的一些庫(kù)如librt,libm,libc,libdl。因而原始命令(#make -n|grep ffmpeg_g)中g(shù)libc的一些庫(kù)(libm,libc,librt,libdl,libpthread)被反復(fù)調(diào)用,分布于多個(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 -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 ?? 因此,為了能夠靜態(tài)鏈接glibc的幾個(gè)庫(kù),需要手動(dòng)修改這條最終的鏈接命令:把所有g(shù)libc的庫(kù)放到最后,以如下方式: -lm -lrt -ldl ?-lm -lpthread -lrt ??-static -lc ? 注意,-static -lc (libc.a)必須放到最后(pthread之后),因?yàn)閜thread和c庫(kù)有函數(shù)重定義的沖突。 ? 這條語(yǔ)句最終為: 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 盡管它執(zhí)行會(huì)報(bào)出一些warnning,但是,不影響生成ffmpeg_g可執(zhí)行文件。 然后執(zhí)行, #cp ffmpeg_g ffmpeg #strip ffmpeg 即可 測(cè)試ffmpeg總結(jié)
以上是生活随笔為你收集整理的ffmpeg 纯静态编译,以及添加自定义库流程摘要的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 基于Kubernetes的分布式压力测试
- 下一篇: 时间轮