windows上使用msys編譯64位x264和ffmpeg

1. 安裝msys

msys(Minimal GNU system on Windows),是一個小型的GNU環境,包括基本的bash,make等等。與Cygwin差很少吧, 我也沒用過cygwinhtml

下載地址: https://msys2.github.io/linux

雙擊mingw64_shell.bat, 進入shell界面。(新的版本也可能沒有這個文件了, 本身找找相似的吧).  使用uname -a查看系統信息:git

$ uname -a
MINGW64_NT-6.1 Galaxy 2.3.0(0.290/5/3) 2015-09-15 09:39 x86_64 Msys

使用pacman更新系統github

pacman –Suy

這個命令會同步數據源, 安裝最新的msys, 而且安裝mingw32和mingw64工具。pacman的使用說明,能夠在下面這個網址上查到web

https://www.archlinux.org/pacman/pacman.8.htmlshell

再次執行uname-a,能夠看到系統已經升級到2.5.1了bash

$ uname -a 
MSYS_NT-6.1 Galaxy 2.5.1(0.297/5/3) 2016-05-16 10:51 x86_64 Msys

2. 編譯x264

將x264拷貝到msys64的home目錄下, 執行配置腳本函數

./configure --host=mingw64 --enable-static --prefix=/home/x264-bin

可能會提示下面這樣的錯誤,意思是config.guess和config.sub這兩個腳本太舊了,須要從新下載它們工具

./config.guess: unable to guess system type

This script, last modified 2012-09-25, has failed to recognize
the operating system you are using. It is advised that you
download the most up to date version of the config scripts from

  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
and
  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD

按照提示,打開這兩個網頁,網頁的內容分別複製到config.gess和config.sub, 而後再次執行configure命令。此次應該能夠成功了,顯示以下信息debug

platform:      X86_64
byte order:    little-endian
system:        WINDOWS
cli:           yes
libx264:       internal
shared:        no
static:        yes
asm:           yes
interlaced:    yes
avs:           avisynth
lavf:          no
ffms:          no
mp4:           no
gpl:           yes
thread:        posix
opencl:        yes
filters:       crop select_every
debug:         no
gprof:         no
strip:         no
PIC:           no
bit depth:     8
chroma format: all

You can run 'make' or 'make fprofiled' now.

執行make

$ make

最終可能編譯不過,出現以下的錯誤:

libx264.a(cpu.o):cpu.c:(.text+0x631):對‘pthread_num_processors_np’未定義的引用
libx264.a(cpu.o):cpu.c:(.text+0x631): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `pthread_num_processors_np'

msys2自帶的libpthread.a中沒有pthread_num_processors_np這個接口, 因此連接時會提示未定義的符號,解決的方法有兩個:

方法1:  禁用thread

./configure --host=mingw64 --enable-static --disable-thread --prefix=/home/x264-bin
方法2: 使用pthread-win32代替系統的libpthread.a。pthreads-win32的官網爲

https://sourceware.org/pthreads-win32/

下載最近發佈的版本

ftp://sourceware.org/pub/pthreads-win32/dll-latest

下載dll-latest/lib/x64/libpthreadGC2.a,  這是gcc使用的版本

刪除msys64/usr/lib/libpthread.a,  使用libpthreadGC2.a來代替,以後應該就能夠編譯經過

3.編譯ffmpeg

下載最新版本的ffmpeg, (個人版本是2.6.3),  在msys上安裝yasm

pacman -S yasm

執行configure

./configure --target-os=win64 \
  --arch=x86_64 \
        --enable-static \
        --enable-memalign-hack \
        --enable-small \
        --enable-version3 \
        --enable-gpl \
        --enable-nonfree \
        --disable-stripping \
        --disable-encoders \
        --disable-decoders \
  	--enable-decoder=h264 \
  	--enable-encoder=libx264 \
  	--enable-encoder=mjpeg \
  	--enable-encoder=mpeg4 \
  	--prefix=./lib \
   	--enable-libx264 \
   	--extra-cflags="-I/home/x264-bin/include" \
        --extra-ldflags="-L/home/x264-bin/lib"

這個過程應該很簡單,麻煩的是,在連接最終的應用程序時,有不少函數找不到。須要本身去實現一版

相關文章
相關標籤/搜索