因本人主要在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、環境搭建
(1)下載文件
FFmpeg源碼下載這里就不多說了,自己去下載哈
以下文件請按照具體情況下載(電腦64位的請下64位的)
C99-to-C89 Converter & Wrapper(https://github.com/libav/c99-to-c89/releases)(如果無法下載請點這里)
Msinttypes(http://code.google.com/p/msinttypes/downloads/list)(如果無法下載請點這里)
MinGW,包含MSYS(http://sourceforge.net/projects/mingw/)(如果無法下載請點這里)
YASM(http://yasm.tortall.net/Download.html)(請下與系統環境對應的yasm-1.3.0,不是vsyasm,最近有些童鞋下載成vsyasm了如果無法下載請點這里)
(2)安裝MinGW
下載好MinGW之后可以直接雙擊打開,按照默認的方式安裝(建議默認安裝,安裝目錄為C:\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安裝目錄,如果是默認的安裝目錄你就按照上邊的路徑去找這個文件,每個人酌情而定,自己斟酌)
加好之后的效果如下:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
(3)配置C99
配置好這個環境之后我們需要配置一下c99wrap環境(因為vs2010只支持到c89,不支持c99,所以這里要安裝c99),將C99-to-C89壓縮包里面的c99conv.exe、c99wrap.exe、makedef着三個文件復制到C:\MinGW\msys\1.0\bin(如果你下載的是我提供給你的壓縮包,此步驟不用做,以防萬一你要確認一下哦),配好之后的效果如下:
配置好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位系統):
- 1
- 2
- 3
- 4
這里你要注意了,這是環境配置的最后一步,也是最重要的一步,千萬不要忘了將MinGW的bin目錄加入到環境變量當中,具體操作為 我的電腦->右擊->屬性->高級設置->環境變量->Path 在末尾添加一項(如果此時末尾沒有英文的分號,請記得添加之前加上英文的分號);添加的兩個環境變量值分別為C:\MinGW\msys\1.0\bin和C:\MinGW\bin,添加好的效果如下:
- 1
- 2
(4)配置ffmpeg所需頭文件
不要急着退出,此時你還需要新建一個名為INCLUDE的系統環境變量,變量值隨意指向一個文件夾,這個文件夾下要裝我們所下載的Msinttypes壓縮包內的兩個頭文件,我的目錄為D:\FFmpeg\include;
配置好之后的效果如下:
到這里,環境就算配置好了,你所需要做的就是重啟電腦,不用擔心重啟好環境會崩潰哦,重啟完之后我們將進入編譯階段哦
- 1
- 2
3、編譯
重啟完電腦之后你需要找到Visual Studio x64 兼容工具命令提示(2010)這個工具,具體位置如圖所示:
以管理員打開,進入你的MinGW安裝目錄,運行msys.bat,運行之后會彈出MinGW32工具,運行效果如圖所示:
- 1
- 2
打開MinGW之后,我們需要進入FFmpeg源碼根目錄,使用命令./configure -h獲取編譯命令
如果有小伙伴對編譯命令(./configure -h)命令不熟悉的,可以參考這篇文章:
編譯FFmpeg是configure文件幫助選項詳解
http://blog.csdn.net/u010380485/article/details/54089918
如果你要生成pdb文件,命令 --toolchain=msvc是必不可少的
注意,你在configure之前一定要記得修改根目錄下的configure文件,讓它支持c99,修改后的效果如下所示:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
我使用的命令為
--enable-shared --enable-gpl --enable-version3 --toolchain=msvc --prefix="D:\FFmpeg\bin\FFmpeg3.2.2"
configure之后我們就可以使用命令 make 開始編譯了,由於我已經編譯過了,我這里直接給大家展示結果
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
使用vs調試效果如下圖所示
- 1
- 2
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