2012年9月22日土曜日

ファイル選択ダイアログを開くとフリーズ(反応無し)になる元凶を見つけたよ

はじめに

最近、新マシンを新調し、環境構築をせっせとしているのだが、Exact audio copy (EAC) や Chrome などで、ファイル選択ダイアログを開くと、選択しても、しなくても、×ボタンで閉じたときでさえ、毎回フリーズして、アプリケーションが、応答しなくなったり、強制終了となる事象が発生して困っていた。
今日、その元凶が判明したので、さらしておく。

注意事項

今回の手順を実行すると、最悪で、起動不能になる場合もありえる。
実施は、くれぐれも自己責任で。

動作環境

Windows7 Professional 64bit SP1
CPU:AMD FX(tm)-8150 Eight-Core
メモリ:16GB

原因特定に利用したソフト

ShellExView
システムにインストールされている、シェルエクステンション(シェル拡張)を、一覧表示して、個別に機能を有効・無効化できるソフト。

元凶

DAEMON Tools Pro (DT Soft Ltd)

シェル拡張名:Image Catalog
バージョン: 4.40.0312.0221
ファイル:D:\appli\DAEMON Tools Pro\DTShl64.dll
ファイルサイズ:696,128 バイト

TortoiseSVN

バージョン:1.7.9-64bit

TortoiseGit

バージョン:1.7.12.0-64bit

特定方法

同様の現象を Google 先生に問い合わせると、どうやら腐ったシェルエクステンション(シェル拡張)が、原因なことが多いとか。
であれば、アヤシイものを、片っ端から無効にして、確かめるしかない。
そこで ShellExView の登場である。

実際の使用方法は、いたって簡単。
無効化したいものを選択し、右クリックしてコンテキストメニューから「Disable Selected Items」を、選択する。ただし、Microsoft のものは、避けたほうがいい。Microsoft 以外のものは、背景がピンク色になっているもので、一覧の「Microsoft」項目が「No」になっている。
再起動して、現象が発生するかを確かめる。
以上。

対処方法

DAEMON Tools

元凶を無効化する。

TortoiseSVN

設定を開き、「アイコンオーバーレイ」を選択。
「アイコンオーバーレイ/状態表示列」で、「エクスプローラー上でのみオーバーレイとコンテキストメニューを表示」チェックボックスにチェックを付ける。

TortoiseGit

TortoiseSVNと同様の対処を行っても、改善されず。
シェルエクステンションの無効化しかないかも。
でもそれだと、インストールする意味がまったくないよ。

愚痴

率直に言うと、「またおまえか!」って感じです。ほんとに、DAEMON Tools には、マルウェア騒動以来、悪いイメージしかない。
バンドル版なので、アップデートもできないし、アップデートダイアログで表示される、金払って延長しろってボタン以外、×ボタンも閉じるボタンも、数秒間無効化されて押せないし。
ほんっっっとに、感じ悪い。そういうメンタルは、有料版ユーザに対しても、変わるとは思えない。
腹が立ってきたので、アンインストールすることにする。
こういう下種な小細工は、競合がいない場合にのみ、有効なんだよ。
同じ金を払うなら、平均より上の別のソフトにするに決まってる。

と、悪態をついてはみたが、SVN 64bit版や Git 64bit版などのシェルエクステンションを使用しているものが、けっこう駄目になっていることを考えると、Windows7 が悪い気がしてきた。しかも 64bit 版特有の問題かもしれない。仕事場で使っている Windows7 32bit 版では、問題が起きていないし、 Vista 64bit 版 SP2 でも、こんなことはなかった。
現象から察するに、ファイルエクステンションや、ファイル選択ダイアログの仕様が変わってるのかもしれない。
しかし、いくらなんでも、アプリもろとも強制終了とか、ありえないと思う。
やっぱり Windows の SP1 は、ベータ版ってことだね。

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 などになっているものを探す。


2012年9月9日日曜日

Ubuntu 上に、Windows 64bit 用のクロスコンパイル環境を構築

はじめに

Ubuntu 上に、Windows 64bit 用のクロスコンパイル環境を構築したくなった。
Windows 7 に VMware をインストールし、その上で Ubuntu を動作させることとする。

動作環境

Windows 7 Professional 64bit SP1
VMware Playre 5 (VMware-player-5.0.0-812388.exe)
Ubuntu 12.04 LTS Alternative amd64 (ubuntu-12.04.1-alternate-amd64.iso)

環境構築

VMware は、インストール済みとする。

仮想マシンの作成

VMware を起動し、「新規仮想マシンの作成」を行う。
以下、設定した値を列挙する。
インストール元:「後で OS をインストール」を選択。
※ 「インストーラ ディスク イメージ ファイル」を選択すると、「簡易インストール」モードになってしまい、デスクトップ環境がインストールされない。通常インストールするには、「後で OS をインストール」を選択する必要がある。

ゲストOS:「Linux」
バージョン:「Ubuntu 64ビット」
仮想マシン名:「Ubuntu64」
場所:任意
ディスク最大サイズ(GB):「50」
「仮想ディスクを単一ファイルとして格納」

「ハードウェアをカスタマイズ」ボタンを押下。
メモリ:「2048」MB
プロセッサ:「4」
新規 CD/DVD(IDE):接続「ISO イメージ ファイルを使用する」、「ubuntu-12.04.1-alternate-amd64.iso」を指定する。

Ubuntu のインストール

仮想マシンを起動すると、Ubuntu のインストールが始まる。
適宜、値を設定する。
インストール中、ウィンドウ下部に、VMware Tools のインストールを促すメッセージが出るが、インストール完了まで放置しておく。

ディスクのパーティショニングについは、「ガイド - ディスク全体を使い、LVM をセットアップする」を選択した。この項目は、Alternate 版のみで表示される項目(なはず)。

ポコペンッ と Ubuntu が起動したら、インストール中に設定した、ユーザーでログインする。

アップデート

端末を起動
※ 10.04 を使っていたので、12.04 では UI 周りがガラッと変わっていて、よ~わからん状態・・・。最初は、端末の起動をするだけで、悶絶してしまったw。
左上の「Dash ホーム」をクリックして、「端末」と入力して検索するか、「Dash ホーム」アイコンを右クリックして、「アプリケーション」を選択、「インストール済み」の中から、探し出す。
む~・・・慣れの問題か・・・。

sudo aptitude update
sudo aptitude full-upgrade

VMware Tools のインストール

ウィンドウ下に、ずっと出ていた「ツールのインストール」ボタンを押下。
ドライブがマウントされ、「VMwareTools-9.2.0-799703.tar.gz」ファイルが表示される。
ファイルを右クリックして、「展開...」を選択。
展開先を適宜選択して、「展開」ボタンを押下。

「端末」のコマンドラインで、展開先の「vmware-tools-distrib」ディレクトリに移動。
sudo ./vmware-install.pl

すべてデフォルト値のまま Enter

再起動する。
sudo reboot now

MinGW-w64 をインストール

端末を起動

sudo aptitude install mingw-w64 g++-mingw-w64 binutils-mingw-w64

以下の新規パッケージがインストールされます:
  binutils-mingw-w64 binutils-mingw-w64-i686{a} binutils-mingw-w64-x86-64{a} g++-4.6{a} g++-mingw-w64 g++-mingw-w64-i686{a} 
  g++-mingw-w64-x86-64{a} gcc-mingw-w64{a} gcc-mingw-w64-base{a} gcc-mingw-w64-i686{a} gcc-mingw-w64-x86-64{a} libstdc++6-4.6-dev{a} 
  mingw-w64 mingw-w64-dev{a} 
0 個のパッケージを更新、 14 個を新たにインストール、 0 個を削除予定、0 個が更新されていない。
80.5 M バイトのアーカイブを取得する必要があります。 展開後に 341 M バイトのディスク領域が新たに消費されます。
先に進みますか? [Y/n/?] 

インストールが完了すると、「/usr/bin」に「x86_64-w64-mingw32-c++」などのコマンドが増えている。
「/usr/x86_64-w64-mingw32」にクロスコンパイル用のヘッダや、ライブラリが格納されている。

インストールしたバージョン

binutils-mingw-w64          2.22-2ubuntu1+1
binutils-mingw-w64-i686     2.22-2ubuntu1+1
binutils-mingw-w64-x86-64   2.22-2ubuntu1+1
g++-mingw-w64               4.6.3-1ubuntu5+5ubuntu1
g++-mingw-w64-i686          4.6.3-1ubuntu5+5ubuntu1
g++-mingw-w64-x86-64        4.6.3-1ubuntu5+5ubuntu1
gcc-mingw-w64               4.6.3-1ubuntu5+5ubuntu1
gcc-mingw-w64-base          4.6.3-1ubuntu5+5ubuntu1
gcc-mingw-w64-i686          4.6.3-1ubuntu5+5ubuntu1
gcc-mingw-w64-x86-64        4.6.3-1ubuntu5+5ubuntu1
mingw-w64                   2.0.1-1
mingw-w64-dev               2.0.1-1


その他ツールのインストール

nasm および yasm

両方ともアセンブラ。ビルド時に必要になることがある。両方入れておけば、問題ない。

sudo aptitude install nasm yasm

構成管理ツール

git および subversion をインストール。

sudo aptitude install git subversion

checkinstall

make install などで、インストールすると、パッケージ管理の対象外となってしまうが、checkinstall を使用することで、rpm や dep などのパッケージを作成でき、パッケージ管理可能となる。

sudo aptitude install checkinstall

autoreconf

autogen.sh の中で使ってたりする。

sudo aptitude install dh-autoreconf

ccache

コンパイル結果をキャッシュして、2回目以降の実行時間を短縮するためのツール。1回しかコンパイルしないのならば、必要ない。

sudo aptitude install ccache

ccache g++ hoge.cpp のように実行する方法や、 PATH の先頭に /usr/lib/ccache/ ディレクトリを追加して、 g++ などのリンクファイル(リンク先は、ccache)を実行する方法などがある。
/usr/lib/ccache/ ディレクトリの実行リンクファイルは、ccache のインストール時に、自動的に更新されるようだ。

実際には以下のようにする。
PATH=/usr/lib/ccache:${PATH} make

実行結果のキャッシュ先は、デフォルトで「${HOME}/.ccache」ディレクトリになっている。
変更する場合は、「CCACHE_DIR」環境変数に設定する。

最大キャッシュサイズのデフォルト値は、1GBになっている。必要に応じて、最大値を以下のように設定できる。10 GByte に増やした。設定は、キャッシュディレクトリごとに、行う必要がある。

CCACHE_DIR=${HOME}/.ccache-mingw64 \
ccache -M 10G

設定した値は、以下のように確認できる。

CCACHE_DIR=${HOME}/.ccache-mingw64 \
ccache -s

cache directory                     /home/user1/.ccache-mingw64
cache hit (direct)                    34
cache hit (preprocessed)               0
cache miss                            42
called for link                       18
preprocessor error                     1
no input file                          1
files in cache                        99
cache size                           564 Kbytes
max cache size                      10.0 Gbytes

「CCACHE_DIR」は、デフォルト値のディレクトリを利用する場合、いちいち指定する必要はない。または、export しておいてもよい。

ビルド

実際にビルドを行ってみる。

zlib

zlib のページからソース(zlib-1.2.7.tar.bz2)をダウンロードしてくる。
適当なディレクトリでソースを展開。

tar jxvf zlib-1.2.7.tar.bz2
cd zlib-1.2.7

CC=x86_64-w64-mingw32-gcc \
AR=x86_64-w64-mingw32-ar \
RANLIB=x86_64-w64-mingw32-ranlib \
LDSHAREDLIBC="" \
./configure --prefix=/usr/x86_64-w64-mingw32

PATH=/usr/lib/ccache:${PATH} \
CCACHE_DIR=${HOME}/.ccache-mingw64 \
make

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

完了

アンインストールする場合は、「dpkg -r zlib-mingw-w64-x86-64」とする。