手把手教你在Windows下使用MinGW編譯libav

手把手教你在Windows下使用MinGW編譯libav linux

libav是在Linux下使用純c語言開發的,不可避免的,libav源碼使用了一些gcc的特性,那麼在Windows下很難使用VC編譯,可是使用MinGW編譯卻簡單多了,下面我將根據本身的經歷逐步介紹使用MinGW編譯libav的過程以及在此過程當中遇到的問題及其解決方法。c++

1      安裝MinGW編譯環境
1.1    安裝MinGW
l  下載和運行最新的mingw-get-inst版本。git

l  選擇安裝MinGW的目錄,注意:安裝目錄的路徑中不能包含空格符。bash

l  安裝可選的組件:C++編譯器、Forthan編譯器、Objective-C編譯器、Ada編譯器和MSYS。網絡

 

圖1:選擇須要安裝的組件ide

 

因爲咱們須要使用MinGW編譯libav,所以除了C編譯器以外,還須要選擇C++編譯器和MSYS,如圖1所示。編碼

接下來,安裝程序會下載並運行mingw-get CLI安裝程序安裝GCC 。取決於你的網絡情況,這個過程可能會持續數分鐘。在使用MinGW以前,請將${MinGWDir}\bin添加到PATH環境變量,其中${MinGWDir}是MinGW的安裝目錄,默認狀況下${MinGWDir}=C:\MinGW。spa

安裝完成後,打開開始菜單 ->程序 -> MinGW -> MinGW Shell,運行MinGW。操作系統

1.2    安裝coreutils
請檢查${MinGWDir}\msys\1.0\bin(默認爲C:\MinGW\msys\1.0\bin)下有沒有pr.exe,若是沒有,那麼在編譯libav過程當中,執行./configure會報錯:pr command not found。.net

下載coreutils-win32-5.3.0-bin.zip,解壓並將bin目錄下的內容拷貝到${MinGWDir}\msys\1.0\bin(默認爲C:\MinGW\msys\1.0\bin)下。

1.3    安裝yasm.exe
編譯libav須要用到yasm.exe,若是你的系統中沒有yasm.exe,執行./configure會報錯:yasm not found。下載Windows 32位版本的yasm.exe(若是使用64位系統,下載64位的yasm.exe)。

下載完成以後,重命名爲yasm.exe,並將之拷貝到${MinGWDir}\msys\1.0\bin(默認爲C:\MinGW\msys\1.0\bin)下。

到此爲止,編譯環境已經搭建完成。

2      安裝git
libav是使用git開發的,所以你須要安裝一個git客戶端來取得git的源代碼。

下載git客戶端,默認安裝便可。安裝完成以後,打開 開始菜單 -> 程序 -> Git-> Git Bash 運行git控制檯。

Git Bash是一個類Linux Shell控制檯,其用法與Linux下的Bash一致。

3      編譯libx264
若是你運行libav下的./configure時,啓用了--enable-libx264選項,那麼在編譯過程當中,libav就會依賴libx264,所以你須要提早編譯libx264。若是你不啓用--enable-libx264選項,那麼你能夠跳過這一節。

3.1    獲取libx264源碼
新建一個目錄用於存放libx264的源代碼(例如我在D盤下新建了名爲x264的目錄),注意存放該代碼的路徑中不該該包含空格符。

啓動git bash,並進入剛纔新建的目錄。以個人爲例,在git bash下輸入cd /d/x264便可。

進入源碼目錄以後,在git bash中鍵入git clone git://git.videolan.org/x264.git。按回車以後git就會自動從源碼庫下載源碼到本地。取決於你的網絡情況,這個過程可能會持續數分鐘。

3.2    編譯libx264
代碼下載完成以後,啓動MinGW,並進入x264源碼目錄。以個人爲例,在MinGW bash下輸入cd /d/x264/x264便可。

輸入./configure –help查看配置選項。你能夠根據本身的須要選擇配置選項。

個人配置選項是--enable-shared --disable-cli --enable-win32thread(推薦啓用這個選項,不然編譯出來的libx264會依賴MinGW的pthreadGC2.dll,這樣你打包發行程序時就會額外附加一個dll文件)。

鍵入./configure --enable-shared --disable-cli --enable-win32thread,按回車,配置編譯環境。配置成功以後,系統會提示:You can run ‘make’ or ‘make fprofiled’ now.

鍵入make命令,就會開始編譯了,這個過程很快就結束,若是編譯成功的話,你就可以在源碼目錄下面找到libx264-128.dll文件(取決於你的x264源碼版本,128多是一個其餘的數字,不過這個版本號不能低於118,不然沒法經過libav配置檢查)和libx264.dll.a文件。

4      編譯libav
4.1    配置libx264
若是你但願你的libav支持x264編碼,那麼在編譯libav時,你的編譯環境中就須要libx264庫,不然配置libav時,會報錯:ERROR: libx264 not found;若是你不須要x264,那麼你能夠跳過這一節。

將生成的libx264-128.dll(參考第3節)拷貝到${MinGWDir}\bin(默認爲C:\MinGW\bin)下;將生成的libx264.dll.a拷貝到${MinGWDir}\lib(默認爲C:\MinGW\lib)下;將源碼x264.h和x264_config.h拷貝到${MinGWDir}\include(默認爲C:\MinGW\include)下。這樣你的MinGW就具有了libx264環境。

4.2    獲取libav源碼
建立一個目錄c++workspace(目錄名取決於你的喜愛)用於存放源代碼。打開git bash,進入該目錄(cd /d/c++workspace/ 你的路徑有可能與個人不一樣)。

鍵入git config --global core.autocrlf false。默認狀況下,git會根據你的操做系統環境自動將文本文件的換行符替換成當前系統默認的換行符,若是你使用Windows操做系統,那麼git會將換行符換成\r\n,若是你使用的unix-like操做系統,換行符就會替換成\n。因爲libav是在linux下開發的,其全部源碼文件的換行符都是\n,那麼你使用git clone其源碼時,git會將全部的\n替換成\r\n,當使用MinGW編譯時,MinGW不識別\r\n,當執行make時,會報告一個錯誤:library.mak:92:*** missing separator. Stop. 。面命令的做用就是讓git不要自動將\n替換成\r\n。

而後鍵入git clone git://git.libav.org/libav.git。git就會從源碼庫到把源代碼下載到本地。Libav下載連接提供了多個Clone URL。你能夠根據須要選擇一個,我選擇的就是第一個。取決於你的網絡情況,這個過程會持續數分鐘。

4.3    編譯libav
源代碼獲取完以後,打開MinGW bash。進入libav目錄,在MinGW控制檯鍵入./configure --help查看全部的配置選項,你能夠根據須要定製你須要的組件。下面我列下我本身的編譯選項。

./configure --enable-gpl --enable-shared--disable-static --disable-doc --disable-avconv --disable-avplay--disable-avprobe --disable-avserver --enable-libx264 --disable-debug

至於這些編譯選項的具體含義,請鍵入./configure --help獲取幫助。

配置完成以後,會有一個關於pkg-config的警告信息,直接無視便可。(無視的緣由是由於配置選項中添加了--disable-avplay,若是你沒有添加該選項,你須要安裝SDL的MinGW開發庫和pkg-config)。

鍵入make –r命令,就開始大概半個小時的編譯過程。編譯完成以後,編譯生成的結果分佈在各個子目錄下。結果清單以下:

libav\libavcodec目錄:avcodec-54.defavcodec-54.dll avcodec.dll avcodec.lib

libav\libavformat目錄:avformat-54.defavformat-54.dll avformat.dll avformat.lib

等等,因爲篇幅緣由,就不在此一一列出了,你能夠本身到各個目錄下找生成的文件。

你能夠將全部生成的dll、def和lib文件複製到同一個目錄下面。例如:我就將全部生成的dll,def和lib文件都複製到了libav\bin目錄下。注意:生成的libav庫會依賴libx264-128.dll,所以發佈時請將libx264-128.dll與libav庫捆綁在一塊兒。

4.4    使用lib.exe從新生成lib文件
MinGW編譯libav使用dlltool生成lib文件,若是你在VC環境下使用這些lib文件。你須要將項目屬性下的linker-> optimization –> References設置成No (/OPT:NOREF),如圖2所示,不然程序將會崩潰。

圖2:引用設置

使用lib.exe生成的lib文件則沒有這個要求。

若是你想生成在YES (/OPT:REF)選項下(Release模式下的默認選項)正常運行的lib,你執行以下操做:

1.        打開Visual Studio Command Prompt。

2.        進入編譯結果的存放目錄(個人爲D:\c++workspace\libav\bin)。

3.        使用lib.exe生成新的lib文件:鍵入lib /machine:i386 /def:foo-version.def  /out:foo.lib,將命令中的foo-version和foo替換成庫名便可。例如若是你想從新生成avcodec.lib,鍵入lib /machine:i386 /def: avcodec-54.def  /out: avcodec.lib便可。

4.5    兼容MSVC的inttypes.h Libav會用到兩個頭文件stdint.h和inttypes.h。我發現VisualStudio 2010已經提供stdint.h,Visual Studio 2005兩個都沒有提供,所以若是你須要使用libav的話,你須要下載inttypes.h,並將其放置在VC能夠找到的地方。

相關文章
相關標籤/搜索