Image: 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」に変更。
画像: vc9_lame - Visual Studio 2012
次にメニューバーから「ビルド」→「ソリューションのビルド」を選択。
うまくいけば、プロジェクト「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を適用しておく必要がある。)
画像: app lame プロパティページ

この設定変更の実体は、リンカのオプションにある「/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命令を使うプログラムを実行するとエラーになる。
画像: エラーによる強制終了 - lame.exe
画像: エラー署名
画像: エラー報告の内容

ちなみに、このエラー報告に「Exception Information - Code: 0xc000001d」とあるが、これはNTSTATUS値というもので「STATUS_ILLEGAL_INSTRUCTION」(不正な命令が実行された)を意味する。
このことはWindows SDKに含まれているヘッダーファイルからわかる。

ntstatus.h(2085-2093):

// MessageId: STATUS_ILLEGAL_INSTRUCTION
//
// MessageText:
//
// {EXCEPTION}
// Illegal Instruction
// An attempt was made to execute an illegal instruction.
//
#define STATUS_ILLEGAL_INSTRUCTION ((NTSTATUS)0xC000001DL) // winnt

こちらは日本語説明付のNTSTATUSコード一覧。
NTSTATUSエラーコード一覧

○参考文献


※コメント欄が表示されない場合はdisqusについてJavascriptが有効であることを確認して下さい。コメントはスパム防止フィルターによる承認制のため、投稿してもすぐに反映されない場合があります。

管理人 : Akamaki (akm)

は、PCとVTuberに夢中になっている電気技術者です。

私はレトロコンピューティングの愛好家ですが、そのようなリグはもう収集していません。

私の活動はトップページで見ることができます。読んでくれてありがとう!