Windows XP 32bitにおけるOpenAL-softのStatic Linkライブラリ化
OpenALというクロスプラットフォームのオーディオAPIがあります。
仕事上このライブラリを静的リンク(static link)で使うことになったのですが、どうやらOpenALにはWindows用の静的ライブラリ(static library)を出力するオプションがないみたいです(2010-7-27当時)。このためちょこっとオリジナルソースコードに手を入れて作成してみました。メンドウなことにVisualStudio用のソリューションファイルが同梱されておりません。CMakeというツールを一段かまさないといけません(初めて使った)。かな〜り自信無いですが誰かの参考になれば幸い。
なお、今回の仕事はサウンドデバイスのエニュメレーションまで必要としなかったので、複数起動などまでは考慮していません。よって本家のWindowsブランチ(OpenAL-Windows)ではなくOpenAL-Softを対象としました。あしからず。
参考リンク
- http://old.nabble.com/Static-libray-of-OpenAl-Without-DLL-%28For-visual-studio-project%29-td17692636.html
- http://connect.creativelabs.com/openal/Lists/OpenAL%20Development/Flat.aspx?RootFolder=%2Fopenal%2FLists%2FOpenAL%20Development%2FBuilding%20Static%20OpenAL%20in%20Linux&FolderCTID=0x01200200BB72FB7EEB38514F8CD1A9372A031174
- http://connect.creativelabs.com/openal/OpenAL%20Wiki/Enumeration%20with%20OpenAL%20on%20Windows.aspx
開発環境
DirectXは若干古いですが、ほかは大抵最新版を利用しました。
- HP xw6400 Workstation
- Windows XP x86 SP3 English
- Visual Studio 2008 Standard SP1 English
- CMake 2.8.2 --- Windows (Win32 Installer)
- OpenAL 1.1 Core SDK
- Microsoft DirectX SDK (August 2009)
手順
- OpenAL Softをダウンロード&解凍(2010-7-27当時は1.12.854)
- コマンドプロンプトにてOpenALの./buildフォルダへ移動
- まずはOpenAL-SoftのREADMEに従ってVisual Studioソリューションファイルを作ります。ただしCMakeでは-DLIBTYPE=STATICを付けるところが通常とは異なります。
- cd C:\openal-soft-1.12.854\build
- "C:\Program Files\CMake 2.8\bin\cmake.exe" .. -DLIBTYPE=STATIC
- あとはVisual Studioでの作業。"./build/OpenAL.sln"を起動。
- OpenAL32のプロパティ設定を次のように変更
- ソリューションエクスプローラーのOpenAL32上で右クリック、Propertiesを選択。
- "Configuration Properties | C/C++ | Preprocessor | Preprocessor Definitions"に"OPENGL_STATIC"を追加
- "Configuration Properties | Librarian | General | Additional Dependencies"に"winmm.lib"を追加
- "Configuration Properties | C/C++ | Code Generation | Runtime Library"を親プロジェクトと同じ設定に変更
- このときCMakeが勝手にプロジェクトファイルを更新しようとしますが、キャンセル&無視
- dllexport/dllimportさせないよう、オリジナルのソースコードからinclude/al.hとinclude/alc.hの該当部分を修正します。
- in .include/al.h
#if 0 // original >>> #if defined(AL_BUILD_LIBRARY) #define AL_API __declspec(dllexport) #else #define AL_API __declspec(dllimport) #endif #else // <<< original | custom >>> #ifdef OPENAL_STATIC #define AL_API #else #if defined(AL_BUILD_LIBRARY) #define AL_API __declspec(dllexport) #else #define AL_API __declspec(dllimport) #endif #endif // <<< custom #endif // if 0
-
- in include/alc.h
#if 0 // original >>> #if defined(AL_BUILD_LIBRARY) #define ALC_API __declspec(dllexport) #else #define ALC_API __declspec(dllimport) #endif #else // <<< original | custom >>> #ifdef OPENAL_STATIC #define ALC_API #else #if defined(AL_BUILD_LIBRARY) #define ALC_API __declspec(dllexport) #else #define ALC_API __declspec(dllimport) #endif #endif // <<< custom #endif // if 0
- DllMain()のDLL_PROCESS_ATTACH、DLL_PROCESS_DETACHの代替関数として次の関数をinclude/alc.hとOpenAL32/OpenAL32.cに追加します。
- in include/alc.h
#ifdef OPENAL_STATIC /* * Allocation Management */ void InitialiseOpenAL( void ); void FinalizeOpenAL( void ); #endif // OPENAL_STATIC // <<<<< Added code by inazaki 2010.07.09 in OpenAL32/OpenAL32.c // Added code by inazaki 2010.07.09 >>>>> #ifdef OPENAL_STATIC void InitialiseOpenAL( void ) { DllMain(NULL,DLL_PROCESS_ATTACH,NULL); } void FinalizeOpenAL( void ) { DllMain(NULL,DLL_PROCESS_DETACH,NULL); } #endif // OPENAL_STATIC
-
- in .OpenAL32/OpenAL32.c
#ifdef OPENAL_STATIC void InitializeOpenAL( void ) { DllMain(NULL,DLL_PROCESS_ATTACH,NULL); } void FinalizeOpenAL( void ) { DllMain(NULL,DLL_PROCESS_DETACH,NULL); } #endif // OPENAL_STATIC
- あとはまあ一応全体ビルドも通るようにしておこうということでおまけでExamples/openal-info.cの冒頭にInitializeOpenAL()、末尾にFinalizeOpenAL()を追加
- 最後に全体のリビルドを実行
注意点
場合によっては下記リンクのように特定ライブラリを無視したりしなければならないかも。