Windows上でLAME(MP3エンコ)をビルド [VC++2012]
Windowsデスクトップ環境においてVisual C++を使ってLAME 3.99.5(MP3エンコーダー)をビルドする。
今回使った開発環境(コンパイラ)は Visual Studio 2012(Visual C++)。
同じネタで書いた昔の記事はこちらを参照。
→Windows上でLAMEをビルド (VC++2008exp + NASM)
○手順
→The LAME Project(Source Forge)のサイトからLAMEのソースコード(lame-3.99.5.tar.gz)を入手。
ファイル形式は「.tar.gz」という、Linuxでは標準で使われている圧縮ファイル形式である。
このファイルをアーカイブソフトなどを使って展開する。(以下lameフォルダとする)
「vc_solution」フォルダーにある「vc9_lame.sln」を開く。プロジェクト・ソリューションのアップグレード(変換)は画面に従って適当に進める。
いくつか警告が出るが、無視してよし。
完了したら、メイン画面のツールバーからソリューション構成を「Release SSE2」に変更。
次にメニューバーから「ビルド」→「ソリューションのビルド」を選択。
うまくいけば、プロジェクト「app mp3x」以外のビルドが成功するはず。
「mp3x」はMP3ファイルのフレーム解析ツール(GUI)で、ビルドするにはGTKライブラリが必要。これはLAMEエンコーダーとはあまり関係ないので、ビルドする必要はない。
lameフォルダーのoutputフォルダー内にlame.exeやその他ライブラリ群が出力されていればビルド成功。
○Windows XPで実行可能な形式にする
Visual Studio 2012の標準設定で作成したプログラムはWindows XPでは動かない。XP上で実行すると「有効な Win32 アプリケーションではありません」というエラーメッセージで強制終了してしまう。
Visual C++においてWindows XPをターゲットOSに含めるには、構成プロパティで「全般」→「プラットフォーム ツールセット」を「Visual Studio 2012 - Windows XP (v110_xp)」に設定する。(あらかじめ→Visual Studio 2012 Update 1を適用しておく必要がある。)
この設定変更の実体は、リンカのオプションにある「/SUBSYSTEM:WINDOWS」が「/SUBSYSTEM:WINDOWS",5.01"」になるだけのこと。
ちなみにVisual C++ 2012に付属するリンカの標準設定ではPEヘッダーのMajorSubsystemVersionは6になる。つまり、内部バージョン6.0であるWindows Vista以降でないと実行できなくなる。Windows XP 32ビット版は内部バージョンが5.1であるため、エラーが表示されるわけである。
.net Frameworkアプリケーションの場合は通常通り、フレームワークを3.5以前に設定すればWindows XPで動作可能である。
別途ランタイムライブラリ(→Visual Studio 2012 Update 1 Visual C++ 再頒布可能パッケージ)を添付・インストールするのを忘れずに。
○AVX命令による最適化を有効にする
「libmp3lame-static」の構成プロパティから「C/C++」→「コード生成」→「拡張命令セットを有効にする」を 「Advanced Vector Extensions(/arch:AVX)」に設定してビルドすると、わずかながらエンコードが速くなる。
ただし、AVX未対応CPUでAVX命令を使うプログラムを実行するとエラーになる。
ちなみに、このエラー報告に「Exception Information - Code: 0xc000001d」とあるが、これはNTSTATUS値というもので「STATUS_ILLEGAL_INSTRUCTION」(不正な命令が実行された)を意味する。
このことはWindows SDKに含まれているヘッダーファイルからわかる。
ntstatus.h(2085-2093):
//
// MessageText:
//
// {EXCEPTION}
// Illegal Instruction
// An attempt was made to execute an illegal instruction.
//
#define STATUS_ILLEGAL_INSTRUCTION ((NTSTATUS)0xC000001DL) // winnt
こちらは日本語説明付のNTSTATUSコード一覧。
→ NTSTATUSエラーコード一覧
○参考文献
- プラットフォームの互換性とシステム要件 - Microsoft Visual Studio 2012
- Configuring C++ 11 Programs for Windows XP - MSDN Library
- /arch (最小限の CPU アーキテクチャ) - MSDNライブラリ
- ntstatus.h - Microsoft Windows SDK for Windows 7 and .NET Framework 4