1. 程式人生 > >windows下使用Visual Studio編譯可以除錯的FFmpeg

windows下使用Visual Studio編譯可以除錯的FFmpeg

因本人主要在windows環境下開發,Linux下的gpb除錯工具又不如vs除錯方便(使用過其他除錯工具才知道,vs果真為宇宙最強除錯工具),所以決定在windows編譯可以除錯FFmpeg,以方便除錯和學習FFmpeg內部程式碼。
有過在visual studio下程式設計的小夥伴應該都知道vs的除錯資訊主要依靠於pdb檔案,那麼我們今天編譯的目的就是使FFmpeg的動態庫生成相應的pdb檔案。

1、首先要宣告一下環境,windows7 64位+visual studio 2010 + MinGW,其他系統無礙,如果不是visual studio 2010環境的小夥伴可以略過這篇文章了。如果環境正確,接下來的步驟小夥伴們可要一步一步盯住了哦。

2、環境搭建

(2)安裝MinGW
下載好MinGW之後可以直接雙擊開啟,按照預設的方式安裝(建議預設安裝,安裝目錄為C:\MinGW),此期間可能要下載一些檔案,不同人因為網路的不同可能安裝的時長也不相同。安裝好之後返回桌面,雙擊快捷方式,開啟介面如下(我的外掛都已經安裝好了,所以有綠色的部分):
MinGW安裝效果

如果你是第一次安裝,請在和我同名的選項下右擊,然後點Mark for Installation,全部選完之後點選單欄的Installation->Apply Change,靜靜的等著下載吧。。。
(如果許久不能下載,你可以點這裡,64位的哦)

安裝好之後,如果上一步驟中MinGW安裝的目錄為C:/MinGW,則找到D:/MinGW/msys/1.0/msys.bat檔案,右擊編輯檔案,在最前面加上一句話為(如果你下載的是我提供給你的MinGW,你一定要確認一下,路徑是否正確):
call” C:\Program Files(x86)\MicrosoftVisual Studio 10.0\VC\bin\vcvars32.bat”
(C:\Program Files(x86)\MicrosoftVisual Studio 10.0\VC\bin\vcvars32.bat  這個路徑為你自己的vs2010安裝目錄,如果是預設的安裝目錄你就按照上邊的路徑去找這個檔案,每個人酌情而定,自己斟酌)
加好之後的效果如下:

修改vcvars32.bat

(3)配置C99
配置好這個環境之後我們需要配置一下c99wrap環境(因為vs2010只支援到c89,不支援c99,所以這裡要安裝c99),將C99-to-C89壓縮包裡面的c99conv.exe、c99wrap.exe、makedef著三個檔案複製到C:\MinGW\msys\1.0\bin(如果你下載的是我提供給你的壓縮包,此步驟不用做,以防萬一你要確認一下哦),配好之後的效果如下:

C99配置

配置好c99後你不要動,在這個目錄下(C:\MinGW\msys\1.0\bin)找到一個名為link.exe的檔案,將他重新命名一下(隨便換個名字),目的是讓他與vc的link.exe不衝突

配置好link之後,我們要配置一下yasm環境,將下載好的yasm-1.3.0.exe改名為yasm.exe,放入系統的執行目錄下,此時你一定要注意32位和64位要對應,32位對應目錄為C:\Windows\System32,64位對應目錄為C:\Windows\SysWOW64,配置好的效果如下(本人的為64位系統):

yasm配置

這裡你要注意了,這是環境配置的最後一步,也是最重要的一步,千萬不要忘了將MinGW的bin目錄加入到環境變數當中,具體操作為   我的電腦->右擊->屬性->高階設定->環境變數->Path  在末尾新增一項(如果此時末尾沒有英文的分號,請記得新增之前加上英文的分號);新增的兩個環境變數值分別為C:\MinGW\msys\1.0\bin和C:\MinGW\bin,新增好的效果如下:

環境變數配置

(4)配置ffmpeg所需標頭檔案
不要急著退出,此時你還需要新建一個名為INCLUDE的系統環境變數,變數值隨意指向一個資料夾,這個資料夾下要裝我們所下載的Msinttypes壓縮包內的兩個標頭檔案,我的目錄為D:\FFmpeg\include;
配置好之後的效果如下:

環境變數配置

標頭檔案配置

到這裡,環境就算配置好了,你所需要做的就是重啟電腦,不用擔心重啟好環境會崩潰哦,重啟完之後我們將進入編譯階段哦

3、編譯
重啟完電腦之後你需要找到Visual Studio x64 相容工具命令提示(2010)這個工具,具體位置如圖所示:

命令工具位置

以管理員開啟,進入你的MinGW安裝目錄,執行msys.bat,執行之後會彈出MinGW32工具,執行效果如圖所示:

執行msys效果

開啟MinGW之後,我們需要進入FFmpeg原始碼根目錄,使用命令./configure -h獲取編譯命令
如果有小夥伴對編譯命令(./configure -h)命令不熟悉的,可以參考這篇文章:
編譯FFmpeg是configure檔案幫助選項詳解 
http://blog.csdn.net/u010380485/article/details/54089918

如果你要生成pdb檔案,命令  --toolchain=msvc是必不可少的


注意,你在configure之前一定要記得修改根目錄下的configure檔案,讓它支援c99,修改後的效果如下所示:

修改configure檔案之後的效果

我使用的命令為

--enable-shared --enable-gpl --enable-version3 --toolchain=msvc --prefix="D:\FFmpeg\bin\FFmpeg3.2.2"



configure之後我們就可以使用命令  make  開始編譯了,由於我已經編譯過了,我這裡直接給大家展示結果

編譯結果

使用vs除錯效果如下圖所示

除錯ffmpeg

除錯FFmpeg

4、注意事項
(1)因vs2010不識別c99語法,而ffmpeg內用了c99語法,我們需要配置c99的環境,與此同時,我們也需要讓編譯知道ffmpeg使用了c99語法,所以我們configure之前必須修改ffmpeg原始碼根目錄的configure檔案,否則你在編譯FFmpeg的過程中會出現語法錯誤的現象,修改方法上邊已附圖。
(2)我編譯過很多版本的FFmpeg,但是唯一在編譯FFmpeg3.x版本出現了莫名其妙的錯誤,如果你也遇到了同樣的問題,那麼請注意這裡,嘗試把FFmpeg依賴的標頭檔案stdint.h刪除,可能是其與vs的相沖突而導致,刪除後即可編譯通過。
(3)如果你在修改別人的程式碼或者是需要libavresample.lib或.h這個檔案,在configure之前記得一定要加上 –enable-avresample,否則將不會生成這個檔案
(4)在使用編譯命令的時候請大家不要在configure的時候加上–enable-debug,如果加上會導致無法vs進入ffmpeg內部除錯,謹記。
(5)如果編譯好的庫在引用的過程中出現
error C3861: ‘UINT64_C’: identifier not found
在common.h里加入定義如下:#ifndef INT64_C#define INT64_C(c) (c ## LL)#define UINT64_C(c) (c ## ULL)#endif(因在編寫文章的時候加入回車鍵導致格式出問題,請新增的時候加入回車鍵)
(6)如果在編譯中出現這個錯誤
錯誤 1 error C1189: #error : missing-D__STDC_CONSTANT_MACROS / #define__STDC_CONSTANT_MACROS
可以直接修改巨集定義為#define __STDC_CONSTANT_MACROS

如果你看了這篇文章之後並且是一步一步按照文章的步驟編譯,可還是沒有編譯成功或者是有其他問題,歡迎加群討論
QQ群445236076