ffmpeg的原生依賴編譯

ffmpeg的原生依賴編譯,你希望想要的那個dll

機器視覺處理時經常要用到視頻和流的處理這就難免要用到ffmpeg這貨了,有時調試和部署時官方的二進制dll是g++版的,而且也不方便修改內部的操作和定製。部署有時依賴問題造成衝突程序崩潰。dll過多拷貝掉就悲劇了。

ffmpeg的編譯是災難的 linux下發展過來的依賴鏈接比較複雜。
下面就將ffmpeg的vc依賴和其他依賴都剔除 編譯出單個ffmpeg動態庫(dll)和靜態庫(lib)我記個筆記: (效果如下圖)

ffmpeg官方下載源碼down下來是4.1
因ffmpeg用MSYS2+msvc來編譯的
官方下載MSYS2安裝 用pacman命令安裝 yasm nasm pkgconfig 工具因我的MSYS2早裝了可能還pacman了其他庫 到時看提示缺什麼吧,注意不用pacman g++因爲這裏用msvc.將ffmpeg源碼在MSYS2的home解壓 見圖

編譯之前ffmpeg有許多的第三方庫依賴 看個人需求先用vc編譯依賴的庫的靜態版lib 我這裏以sdl爲例因爲等會兒ffplay播放器是依賴sdl才編譯出來的。這裏我貼出路徑下的pkgconfig pc文件和配置格式(仔細看下哦)其他庫像x264 x265等等同理設置如下 

將庫放到pkg能檢測到位置 有的庫不是pkg搜索的放 vc可搜索的位置這裏是MSYS2的usr\include和lib 現在從MSVC進msys

修改msys的啓動腳本讓VC的環境變量都繼承到MSYS2環境中 改msys2_shell中的set MSYS2_PATH_TYPE=inherit 打開註釋

現在從vs的命令行cd到msys下運行msys2_shell就行了。

中間缺什麼用 whereis進行搜索測試下。

下面是全部依賴的第三方庫,這些自己看需要去編譯。我這裏就花點功夫全部分編譯靜態版。都是原生依賴於winapi的核心庫(system32下)。全部文件如下圖opt (注意libavcodec libav ...8個文件夾我只是將頭文件拷這)

最後就是cd到ffmpeg源碼目錄進行config測試了 看提示缺什麼就補什麼,如果不用也可以關閉掉。直到全部ok生成makefile後就能執行,這個過程還是比較麻煩的中間會報很多提示主要是路徑和pkg的pc文件檢測

make
make install


看到ffplay了吧。現在avcodecs avformat xx 8個庫的默認是依賴到msvcrt.dll的, 生成的dll用depends看下依賴是不是都是system32核心依賴 而且確定第三方庫也不依賴vcxx庫 到此爲止也該就是大家在網上常見的完整教程了。

接下來就對可編譯的工程處理成想要的動態版 ffmpeg.dll和靜態版lib

分別將avcoudcs xx xx xx xx庫的中間編譯中間文件.obj 或.o拷貝到一個新建文件夾libffmeg中,爲了方便我全部改爲obj文件。

這裏有幾個庫有部分文件名衝突提示替換 分別是avcodec avformat 等5個庫中約有100多個obj需要改下名稱 我是通過bat copy出來在前面加上_的,一共全部obj有約2014個(具體看我共享盤的文件裏的我將全部obj打包了 衝突文件名前加_ 或後面加2等。總之避開衝突)。將第三方庫全部拷貝到新建x86文件夾中
最後就將其與第三方依賴庫鏈接打包成一個ffmpeg_static.lib靜態庫就生成了。

具體就看下圖操作  將2014個obj生成ffmpeg_objs.lib

下面將ffmpeg_objs.lib和第三方庫的全部lib生成 ffmpeg_static靜態大lib

超大靜態lib就生成了。有了靜態庫就不難生成dll了。將ffmpeg目錄裏面所有的def文件裏的函數合併爲一個libffmpeg.def文件一共是1099個函數。爲了方便vc創建個空靜態庫工程把ffmpeg_static.lib拖進vc去再在屬性附上def 編譯 就生成了ffmpeg.dll

也可以用link.exe命令行 改天貼出來吧。

下面就寫個小播放器測試下

分別鏈接個靜態版和動態版exe 效果就這樣了。

有了原生 的動態/靜態庫像其他的庫依賴ffmpeg就再也不必擔心了。鏈接動態靜態都可。

到此爲止怎麼鏈接開心就怎麼弄,自己發揮吧。我貼出全部生成文件和中間obj文件

libffmpeg_20190321223922.7z

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章