2012年9月17日月曜日

Windows 64bit 用の ffmpeg をビルド

はじめに

ちょっと悶絶したくて、Ubuntu 上のクロスコンパイル環境で、Windows 64bit 用の ffmpeg をビルドしてみる。
ライセンスの関係で、配布できないものになるので、注意。

ビルド方法は、偉大なる先人である、「Linux日記: MinGWでx264、ffmpegをビルド」ページをマルパクリ・・・。ありがたや、ありがたや。

make に付いている -j6 は、並列ビルドするオプション。コア数 * 1.5 がいいとかなんとか・・・。場合によって、undefined などのエラーが発生するので注意。
CFLAGS などに指定してある -pipe は、テンポラリファイルではなく、パイプを利用して、メモリを多く使用する代わりに、コンパイルを高速化するオプション。

なお、ビルド手順については、思考錯誤などの手戻りで、ビルド順があやしいので、近々に検証する予定。

【2012/09/19】 ビルド手順の検証完了。やっぱり間違っていた。3回ぐらいやらないと、まともにならないな。手順を見直して、不要なライブラリが削れた。
ついでに、パッチをすべてアップロードした。パッチを当てるときは、解凍したディレクトリに cd してから「patch -p0 < パッチファイル」のようにする。
Blogger のせいなのか、タブ文字がスペース文字に置き換わってしまい、パッチをアップロードせざるを得なかった。

利用したソース

zlib (zlib-1.2.7.tar.bz2)
bzip2 (bzip2-1.0.6.tar.gz)
XZ Utils (xz-5.0.4.tar.bz2)
SDL (SDL-1.2.15.tar.gz)
gpac (gpac-0.5.0.tar.gz)
ffmpeg
ffms2
x264
OpenSSL (openssl-1.0.1c.tar.gz)
libpng (libpng-1.5.12.tar.gz)
libtiff (tiff-3.9.6.tar.gz)
libjpeg-turbo (libjpeg-turbo-1.2.1.tar.gz)
lcms2 (lcms2-2.3.tar.gz)
lame (lame-3.99.5.tar.gz)
faac (faac-1.28.tar.bz2)
libogg (libogg-1.3.0.tar.gz)
libvorbis (libvorbis-1.3.3.tar.gz)
libtheora (libtheora-1.1.1.tar.bz2)
libspeex (speex-1.2rc1.tar.gz)
opencore-amr (opencore-amr-0.1.2.tar.gz)
openjpeg (openjpeg_v1_4_sources_r697.tgz)
xvidcore (xvidcore-1.3.2.tar.bz2)
gsm (gsm-1.0.13.tar.gz)
rtmpdump
libvpx (libvpx-v1.1.0.tar.bz2)
libfdk-aac

未完遂のライブラリ

orc (orc-0.4.16.tar.gz)
libschroedinger (schroedinger-1.0.11.tar.gz)



依存ライブラリのビルド(1週目)

zlib

CFLAGS="-pipe -O2" \
CXXFLAGS="${CFLAGS}" \
CC=x86_64-w64-mingw32-gcc \
AR=x86_64-w64-mingw32-ar \
RANLIB=x86_64-w64-mingw32-ranlib \
LDSHAREDLIBC="" \
PKG_CONFIG_PATH=/usr/x86_64-w64-mingw32/lib/pkgconfig \
./configure --prefix=/usr/x86_64-w64-mingw32

make -j6

sudo checkinstall --pkgname=zlib-mingw-w64-x86-64 \
--pkgversion="1:1.2.7.$(date +%Y%m%d)-0ubuntu1" \
--backup=no --deldoc=yes --fstrans=no --default

bzip2

まず、このパッチを当ててから以下の作業を行う。
make libbz2.a
sudo install -m 644 bzlib.h /usr/x86_64-w64-mingw32/include
sudo install -m 644 libbz2.a /usr/x86_64-w64-mingw32/lib

XZ Utils

CFLAGS="-pipe -O2" \
CXXFLAGS="${CFLAGS}" \
PKG_CONFIG_PATH=/usr/x86_64-w64-mingw32/lib/pkgconfig \
./configure --prefix=/usr/x86_64-w64-mingw32 \
--host=x86_64-w64-mingw32 \
--disable-shared

make -j6

sudo checkinstall --pkgname=xz-utils-mingw-w64-x86-64 \
--pkgversion="1:5.0.4.$(date +%Y%m%d)-0ubuntu1" \
--backup=no --deldoc=yes --fstrans=no --default

SDL

gpac の依存ライブラリ
CFLAGS="-pipe -O2" \
CXXFLAGS="${CFLAGS}" \
PKG_CONFIG_PATH=/usr/x86_64-w64-mingw32/lib/pkgconfig \
./configure --prefix=/usr/x86_64-w64-mingw32 \
--host=x86_64-w64-mingw32 \
--disable-shared

make -j6

sudo checkinstall --pkgname=libsdl-mingw-w64-x86-64 \
--pkgversion="1:1.2.15.$(date +%Y%m%d)-0ubuntu1" \
--backup=no --deldoc=yes --fstrans=no --default

gpac

本家ソースの最新版をコンパイルしてみた。
gpac の依存ライブラリ。
そのままで、Ubuntu 上の MinGW 環境で、静的ライブラリをクロスコンパイルしようとしたら、ひどい有様だった。仕方がないのでパッチを当てたら、パッチファイルが 1300 行を超えた・・・・
パッチは、MinGW 環境での、静的ライブラリ生成専用。動的ライブラリの生成は、できないので注意。
はじめに上記のパッチを当ててから作業を開始する。
パッケージの情報が記述されているが、余計なお世話なのでリネーム
mv gpac.spec gpac.spec_org

PKG_CONFIG_PATH=/usr/x86_64-w64-mingw32/lib/pkgconfig \
./configure  --prefix=/usr/x86_64-w64-mingw32 \
--cross-prefix=x86_64-w64-mingw32- --cpu=x86_64 \
--extra-cflags="-pipe"

make -j6

sudo checkinstall --pkgname=libgpac-mingw-w64-x86-64 \
--pkgversion="1:0.5.0.$(date +%Y%m%d)-0ubuntu1" \
--backup=no --deldoc=yes --fstrans=no --default \
sudo make install install-lib


ビルド(1週目)

ffmpeg

各ライブラリは、相互依存するので、はじめは最小構成で FFmpeg をビルドする。
git clone git://source.ffmpeg.org/ffmpeg.git ffmpeg
commit 83438a0db3c61f06979d1c4159e5c85d52eda488
Date:   Mon Sep 17 00:40:55 2012 +0200
2週目のためにこのパッチを当てる。1週目では必要ないが、ここで当てておく。
PKG_CONFIG_PATH=/usr/x86_64-w64-mingw32/lib/pkgconfig \
./configure --prefix=/usr/x86_64-w64-mingw32 --enable-gpl \
--enable-version3 --enable-nonfree \
--enable-postproc --enable-memalign-hack \
--enable-runtime-cpudetect --enable-avisynth \
--enable-w32threads --cross-prefix=x86_64-w64-mingw32- \
--target-os=mingw32 --arch=x86_64 --cpu=x86_64 \
--extra-cflags="-pipe" --extra-cxxflags="-pipe"

make -j6

sudo checkinstall --pkgname=ffmpeg-mingw-w64-x86-64 \
--pkgversion="1:20120909.$(date +%Y%m%d)-0ubuntu1" \
--backup=no --deldoc=yes --fstrans=no --default

ffms2

svn checkout http://ffmpegsource.googlecode.com/svn/trunk/ ffms2
リビジョン: 712

CFLAGS="-pipe -O2" \
CXXFLAGS="${CFLAGS}" \
PKG_CONFIG_PATH=/usr/x86_64-w64-mingw32/lib/pkgconfig \
./configure --prefix=/usr/x86_64-w64-mingw32 --host=x86_64-w64-mingw32 \
--disable-silent-rules --enable-dependency-tracking \
--disable-shared --enable-static

make -j6

sudo checkinstall --pkgname=ffms2-mingw-w64-x86-64 \
--pkgversion="1:712.$(date +%Y%m%d)-0ubuntu1" \
--backup=no --deldoc=yes --fstrans=no --default \
make install-strip

x264

git clone git://git.videolan.org/x264.git x264
commit 198a7ea13ccb727d4ea24b29f5da9b0292387309
Date:   Thu Aug 16 13:40:32 2012 -0700
まず、このパッチを当ててから以下の作業を行う。
CFLAGS="-pipe -O2" \
CXXFLAGS="${CFLAGS}" \
PKG_CONFIG_PATH=/usr/x86_64-w64-mingw32/lib/pkgconfig \
./configure --prefix=/usr/x86_64-w64-mingw32 \
--host=x86_64-w64-mingw32 \
--cross-prefix=x86_64-w64-mingw32- \
--enable-win32thread \
--enable-static \
--extra-cflags="-pipe -O2" \
--extra-ldflags="-lws2_32"


platform:      X86_64
system:        WINDOWS
cli:           yes
libx264:       internal
shared:        no
static:        yes
asm:           yes
interlaced:    yes
avs:           yes
lavf:          yes
ffms:          yes
gpac:          yes
gpl:           yes
thread:        win32
filters:       resize crop select_every 
debug:         no
gprof:         no
strip:         no
PIC:           no
visualize:     no
bit depth:     8
chroma format: all


make -j6

sudo checkinstall --pkgname=libx264-mingw-w64-x86-64 \
--pkgversion="1:20120816.$(date +%Y%m%d)-0ubuntu1" \
--backup=no --deldoc=yes --fstrans=no --default


依存ライブラリのビルド(2週目)

OpenSSL

make に 並列ビルドオプション(-j)をつけると、undefined エラーとなる。
PKG_CONFIG_PATH=/usr/x86_64-w64-mingw32/lib/pkgconfig \
./Configure --prefix=/usr/x86_64-w64-mingw32 \
--cross-compile-prefix=x86_64-w64-mingw32- \
mingw64 threads zlib no-shared

make

sudo checkinstall --pkgname=openssl-mingw-w64-x86-64 \
--pkgversion="1:1.0.1c.$(date +%Y%m%d)-0ubuntu1" \
--backup=no --deldoc=yes --fstrans=no --default

libpng

openjpeg の依存ライブラリ
CFLAGS="-pipe -O2" \
CXXFLAGS="${CFLAGS}" \
PKG_CONFIG_PATH=/usr/x86_64-w64-mingw32/lib/pkgconfig \
./configure --prefix=/usr/x86_64-w64-mingw32 \
--host=x86_64-w64-mingw32 \
--disable-shared

make -j6

sudo checkinstall --pkgname=libpng-mingw-w64-x86-64 \
--pkgversion="1:1.5.12.$(date +%Y%m%d)-0ubuntu1" \
--backup=no --deldoc=yes --fstrans=no --default

libtiff

openjpeg の依存ライブラリ
4.0.2 でやってみたら、openjpeg で認識してくれなかったので、3.9.6 にした。
CFLAGS="-pipe -O2" \
CXXFLAGS="${CFLAGS}" \
PKG_CONFIG_PATH=/usr/x86_64-w64-mingw32/lib/pkgconfig \
./configure --prefix=/usr/x86_64-w64-mingw32 \
--host=x86_64-w64-mingw32 \
--disable-shared

make -j6

sudo checkinstall --pkgname=libtiff-mingw-w64-x86-64 \
--pkgversion="1:3.9.6.$(date +%Y%m%d)-0ubuntu1" \
--backup=no --deldoc=yes --fstrans=no --default

libjpeg-turbo

openjpeg の依存ライブラリ
CFLAGS="-pipe -O2" \
CXXFLAGS="${CFLAGS}" \
PKG_CONFIG_PATH=/usr/x86_64-w64-mingw32/lib/pkgconfig \
./configure --prefix=/usr/x86_64-w64-mingw32 \
--host=x86_64-w64-mingw32 \
--disable-shared

make -j6

sudo checkinstall --pkgname=libjpeg-turbo-mingw-w64-x86-64 \
--pkgversion="1:1.2.1.$(date +%Y%m%d)-0ubuntu1" \
--backup=no --deldoc=yes --fstrans=no --default

lcms2

openjpeg の依存ライブラリ
CFLAGS="-pipe -O2" \
CXXFLAGS="${CFLAGS}" \
PKG_CONFIG_PATH=/usr/x86_64-w64-mingw32/lib/pkgconfig \
./configure --prefix=/usr/x86_64-w64-mingw32 \
--host=x86_64-w64-mingw32 \
--disable-shared

make -j6

sudo checkinstall --pkgname=liblcms2-mingw-w64-x86-64 \
--pkgversion="1:2.3.$(date +%Y%m%d)-0ubuntu1" \
--backup=no --deldoc=yes --fstrans=no --default

lame

CFLAGS="-pipe -O2" \
CXXFLAGS="${CFLAGS}" \
PKG_CONFIG_PATH=/usr/x86_64-w64-mingw32/lib/pkgconfig \
./configure --prefix=/usr/x86_64-w64-mingw32 \
--host=x86_64-w64-mingw32 \
--disable-shared \
--enable-nasm

make -j6

sudo checkinstall --pkgname=lame-mingw-w64-x86-64 \
--pkgversion="1:3.99.5.$(date +%Y%m%d)-0ubuntu1" \
--backup=no --deldoc=yes --fstrans=no --default

faac

CFLAGS="-pipe -O2" \
CXXFLAGS="${CFLAGS}" \
PKG_CONFIG_PATH=/usr/x86_64-w64-mingw32/lib/pkgconfig \
./configure --prefix=/usr/x86_64-w64-mingw32 \
--host=x86_64-w64-mingw32 --disable-shared --without-mp4v2

make -j6

sudo checkinstall --pkgname=faac-mingw-w64-x86-64 \
--pkgversion="1:1.28.$(date +%Y%m%d)-0ubuntu1" \
--backup=no --deldoc=yes --fstrans=no --default

libogg

CFLAGS="-pipe -O2" \
CXXFLAGS="${CFLAGS}" \
PKG_CONFIG_PATH=/usr/x86_64-w64-mingw32/lib/pkgconfig \
./configure --prefix=/usr/x86_64-w64-mingw32 \
--host=x86_64-w64-mingw32 --disable-shared

make -j6

sudo checkinstall --pkgname=libogg-mingw-w64-x86-64 \
--pkgversion="1:1.3.0.$(date +%Y%m%d)-0ubuntu1" \
--backup=no --deldoc=yes --fstrans=no --default

libvorbis

CFLAGS="-pipe -O2" \
CXXFLAGS="${CFLAGS}" \
PKG_CONFIG_PATH=/usr/x86_64-w64-mingw32/lib/pkgconfig \
./configure --prefix=/usr/x86_64-w64-mingw32 \
--host=x86_64-w64-mingw32 --disable-shared

make -j6

sudo checkinstall --pkgname=libvorbis-mingw-w64-x86-64 \
--pkgversion="1:1.3.3.$(date +%Y%m%d)-0ubuntu1" \
--backup=no --deldoc=yes --fstrans=no --default

libtheora

CFLAGS="-pipe -O2" \
CXXFLAGS="${CFLAGS}" \
PKG_CONFIG_PATH=/usr/x86_64-w64-mingw32/lib/pkgconfig \
./configure --prefix=/usr/x86_64-w64-mingw32 \
--host=x86_64-w64-mingw32 --disable-shared

make -j6

sudo checkinstall --pkgname=libtheora-mingw-w64-x86-64 \
--pkgversion="1:1.1.1.$(date +%Y%m%d)-0ubuntu1" \
--backup=no --deldoc=yes --fstrans=no --default

libspeex

CFLAGS="-pipe -O2" \
CXXFLAGS="${CFLAGS}" \
PKG_CONFIG_PATH=/usr/x86_64-w64-mingw32/lib/pkgconfig \
./configure --prefix=/usr/x86_64-w64-mingw32 \
--host=x86_64-w64-mingw32 --disable-shared --enable-sse

make -j6

sudo checkinstall --pkgname=libspeex-mingw-w64-x86-64 \
--pkgversion="1:1.2rc1.$(date +%Y%m%d)-0ubuntu1" \
--backup=no --deldoc=yes --fstrans=no --default

opencore-amr

CFLAGS="-pipe -O2" \
CXXFLAGS="${CFLAGS}" \
PKG_CONFIG_PATH=/usr/x86_64-w64-mingw32/lib/pkgconfig \
./configure --prefix=/usr/x86_64-w64-mingw32 \
--host=x86_64-w64-mingw32 --disable-shared

make -j6

sudo checkinstall --pkgname=libopencore-amr-mingw-w64-x86-64 \
--pkgversion="1:0.1.2.$(date +%Y%m%d)-0ubuntu1" \
--backup=no --deldoc=yes --fstrans=no --default

openjpeg

make -j6 だと、エラーとなる。早すぎたんだ・・・
CFLAGS="-pipe -O2" \
CXXFLAGS="${CFLAGS}" \
PKG_CONFIG_PATH=/usr/x86_64-w64-mingw32/lib/pkgconfig \
LIBS="-lpng" \
./configure --prefix=/usr/x86_64-w64-mingw32 \
--host=x86_64-w64-mingw32 --disable-shared

----------------------------------------------
           your configuration

--with-png-libraries: yes
libpng header       : yes
--enable-tiff       : yes
libtiff header      : yes
--enable-lcms2      : yes
lcms2 header        : yes
lcms2 version       : 2.3
--enable-lcms1      : no
lcms1 header        : no
lcms1 version       : 
--enable-jpwl       : no
--enable-jp3d       : no
--enable-shared     : no
----------------------------------------------

make

sudo checkinstall --pkgname=libopenjpeg-mingw-w64-x86-64 \
--pkgversion="1:1.4.r697.$(date +%Y%m%d)-0ubuntu1" \
--backup=no --deldoc=yes --fstrans=no --default

xvidcore

以下のようなエラーとなるので

GCC4 から、無くなったオプション
  C: ./decoder.c
cc1: エラー: 認識できないコマンドラインオプション ‘-mno-cygwin’ です

原因は、-DWINDOWS オプション。
以下のコマンドで、生成されたオブジェクトファイルの中身をのぞくと、関数名の先頭にアンダースコアが付いている。
x86_64-w64-mingw32-nm build/generic/\=build/utils/x86_asm/cpuid.obj
  L: xvidcore.a
  L: xvidcore.dll
Creating library file: xvidcore.dll.a
xvid.obj:xvid.c:(.text+0xe0): undefined reference to `check_cpu_features'
xvid.obj:xvid.c:(.text+0x65c): undefined reference to `emms_mmx'
xvid.obj:xvid.c:(.text+0x673): undefined reference to `fdct_mmx_skal'
xvid.obj:xvid.c:(.text+0x67a): undefined reference to `idct_mmx'
...
plugins/plugin_ssim.obj:plugin_ssim.c:(.text+0x12c1): undefined reference to `check_cpu_features'
plugins/plugin_ssim.obj:plugin_ssim.c:(.text+0x12d8): undefined reference to `lum_8x8_mmx'
plugins/plugin_ssim.obj:plugin_ssim.c:(.text+0x12e3): undefined reference to `consim_mmx'
plugins/plugin_ssim.obj:plugin_ssim.c:(.text+0x12fb): undefined reference to `consim_sse2'
collect2: ld はステータス 1 で終了しました
make: *** [xvidcore.dll] エラー 1

まず、このパッチを当ててから以下の作業を行う。

CFLAGS="-pipe -O2" \
CXXFLAGS="${CFLAGS}" \
PKG_CONFIG_PATH=/usr/x86_64-w64-mingw32/lib/pkgconfig \
AFLAGS="-DNO_PREFIX" \
./configure --prefix=/usr/x86_64-w64-mingw32 \
--host=x86_64-w64-mingw32

make -j6

sudo checkinstall --pkgname=libxvidcore-mingw-w64-x86-64 \
--pkgversion="1:1.3.2.$(date +%Y%m%d)-0ubuntu1" \
--backup=no --deldoc=yes --fstrans=no --default

gsm

まず、このパッチを当ててから以下の作業を行う。

make -j6

sudo checkinstall --pkgname=libgsm-mingw-w64-x86-64 \
--pkgversion="1:1.0.13.$(date +%Y%m%d)-0ubuntu1" \
--backup=no --deldoc=yes --fstrans=no --default \
make gsminstall

rtmpdump

git clone git://git.ffmpeg.org/rtmpdump
commit e0056c51cc1710c9a44d2a2c4e2f344fa9cabcf4
Date:   Tue Jul 24 17:17:26 2012 +0200

make SYS=mingw SHARED= CROSS_COMPILE=x86_64-w64-mingw32- \
OPT="-O2" XLIBS="-lcrypt32" \
prefix=/usr/x86_64-w64-mingw32

sudo checkinstall --pkgname=rtmpdump-mingw-w64-x86-64 \
--pkgversion="1:$(date +%Y%m%d)-0ubuntu1" \
--backup=no --deldoc=yes --fstrans=no --default \
make SYS=mingw SHARED= CROSS_COMPILE=x86_64-w64-mingw32- \
OPT="-O2" XLIBS="-lcrypt32" \
install prefix=/usr/x86_64-w64-mingw32

libvpx

pthread がインストールされていない場合、win32thread を利用するようになる。 その時に、windows.h が import されずに「不明な型名 CRITICAL_SECTION」エラーとなるため、このパッチを当てる。
CFLAGS="-pipe -O2" \
CXXFLAGS="${CFLAGS}" \
PKG_CONFIG_PATH=/usr/x86_64-w64-mingw32/lib/pkgconfig \
CROSS=x86_64-w64-mingw32- \
./configure --target=x86_64-win64-gcc --prefix=/usr/x86_64-w64-mingw32 \
--disable-shared \
--disable-examples

make -j6

sudo checkinstall --pkgname=libvpx-mingw-w64-x86-64 \
--pkgversion="1:1.1.0.$(date +%Y%m%d)-0ubuntu1" \
--backup=no --deldoc=yes --fstrans=no --default

libfdk-aac

今回は、GitHub からソースを取得した。
git clone https://github.com/mstorsjo/fdk-aac.git
cd fdk-aac

fdk-aac$ git log
commit 226601a8d9bce81455e161a0e26051d2f22c5d7a
Date:   Mon Mar 18 16:23:17 2013 +0200

CFLAGS="-pipe -O2" \
CXXFLAGS="${CFLAGS}" \
PKG_CONFIG_PATH=/usr/x86_64-w64-mingw32/lib/pkgconfig \
./configure --prefix=/usr/x86_64-w64-mingw32 \
--host=x86_64-w64-mingw32 \
--disable-shared --enable-static --enable-fast-install

make -j6

sudo checkinstall --pkgname=libfdk-aac-mingw-w64-x86-64 \
--pkgversion="1:0.1.1.$(date +%Y%m%d)-0ubuntu1" \
--backup=no --deldoc=yes --fstrans=no --default

ビルド(2週目)

ffmpeg

make clean

PKG_CONFIG_PATH=/usr/x86_64-w64-mingw32/lib/pkgconfig \
./configure --prefix=/usr/x86_64-w64-mingw32 \
--cross-prefix=x86_64-w64-mingw32- --target-os=mingw32 \
--arch=x86_64 --cpu=x86_64 --enable-gpl --enable-version3 \
--enable-nonfree --enable-postproc \
--enable-memalign-hack --enable-runtime-cpudetect \
--enable-avisynth --disable-debug \
--extra-libs="-lws2_32 -lgdi32 -lwinmm"  --enable-w32threads \
--enable-zlib --enable-bzlib --enable-libmp3lame \
--enable-libfaac --enable-libvorbis --enable-libtheora \
--enable-libspeex --enable-libopencore-amrnb \
--enable-libopencore-amrwb --enable-libopenjpeg \
--enable-libxvid --enable-libgsm \
--enable-librtmp \
--enable-libx264 \
--enable-libfdk-aac \
--extra-cflags="-pipe" --extra-cxxflags="-pipe"

make -j6

sudo checkinstall --pkgname=ffmpeg-mingw-w64-x86-64 \
--pkgversion="1:20120909.$(date +%Y%m%d)-0ubuntu1" \
--backup=no --deldoc=yes --fstrans=no --default

ffms2

make clean

CFLAGS="-pipe -O2" \
CXXFLAGS="${CFLAGS}" \
PKG_CONFIG_PATH=/usr/x86_64-w64-mingw32/lib/pkgconfig \
./configure --prefix=/usr/x86_64-w64-mingw32 --host=x86_64-w64-mingw32

make -j6

sudo checkinstall --pkgname=ffms2-mingw-w64-x86-64 \
--pkgversion="1:712.$(date +%Y%m%d)-0ubuntu1" \
--backup=no --deldoc=yes --fstrans=no --default \
make install-strip

x264

configure で、ライブラリを指定しまくらないと、ffms2 が有効にならない。自動的に設定してくれないものなのか・・・
config.log を頼りに、不足のライブラリをせっせと追加したが、心が折れそうになった。
make clean

PKG_CONFIG_PATH=/usr/x86_64-w64-mingw32/lib/pkgconfig \
./configure --prefix=/usr/x86_64-w64-mingw32 \
--host=x86_64-w64-mingw32 \
--cross-prefix=x86_64-w64-mingw32- \
--enable-win32thread --enable-static --enable-strip \
--extra-cflags="-pipe -O2" \
--extra-ldflags="-lx264 -lfdk-aac -lfaac -lgsm -lmp3lame -lopencore-amrnb -lopencore-amrwb -lopenjpeg -ltheoraenc -ltheoradec -lspeex -lvorbis -lvorbisenc -logg -lxvidcore -lrtmp -lssl -lcrypto -lws2_32 -lgdi32 -lwinmm"

make -j6

sudo checkinstall --pkgname=libx264-mingw-w64-x86-64 \
--pkgversion="1:20120816.$(date +%Y%m%d)-0ubuntu1" \
--backup=no --deldoc=yes --fstrans=no --default


実行ファイルのチェック

ビルドした実行ファイルが、DLL 依存になっていないかをチェック。
$ x86_64-w64-mingw32-objdump -p x264.exe | grep 'DLL Name'
 DLL Name: ADVAPI32.dll
 DLL Name: AVIFIL32.dll
 DLL Name: GDI32.dll
 DLL Name: KERNEL32.dll
 DLL Name: msvcrt.dll
 DLL Name: msvcrt.dll
 DLL Name: USER32.dll
 DLL Name: WINMM.dll
 DLL Name: WS2_32.dll

$ x86_64-w64-mingw32-objdump -p ffmpeg.exe | grep 'DLL Name'
 DLL Name: ADVAPI32.dll
 DLL Name: AVICAP32.dll
 DLL Name: AVIFIL32.dll
 DLL Name: GDI32.dll
 DLL Name: KERNEL32.dll
 DLL Name: msvcrt.dll
 DLL Name: msvcrt.dll
 DLL Name: PSAPI.DLL
 DLL Name: SHELL32.dll
 DLL Name: USER32.dll
 DLL Name: WINMM.dll
 DLL Name: WS2_32.dll


備忘録

ビルド中に発生した問題の解決方法を備忘録として残しておく。

configure の先頭行のシェルに -x オプションを付け、デバッグ出力する。

configu.log をみて、依存ライブラリチェック処理のエラーなどを確認する。

undefined reference が、発生した場合は、/usr/x86_64-w64-mingw32 ディレクトリで、
fgrep -r --exclude-dir="bin" --exclude-dir="sbin" 未定義ラベル名 *
のようにして、探す。
ライブラリが絞り込めたら、
x86_64-w64-mingw32-nm lib/libtheoraenc.a | grep th_encode_flushheader
のようにすると、
U th_encode_flushheader
0000000000004d70 T th_encode_flushheader
のように表示される。U は未定義、T などになっているものを探す。