Ootakeにリンクできるlibchdrのビルド方法
libchdrはCHDファイル読込を行うためのライブラリでRetroArchのPCエンジンエミュレーションコア(Beetle PCE FAST)でも使用されています。
https://github.com/rtissera/libchdr
これなら簡単にOotakeへ取り込めそう…と思ったのですが、リンク時に少しハマったのでメモを残します。
結論から記載すると、Ootakeのランタイム ライブラリのオプションは/MTなのでlibchdrも/MTでコンパイルしましょう!という昔からよくある問題でした。
libchdrのビルド
取得したlibchdrのソースを適当なフォルダへ保存。Visual Studio 2022を起動し、「ローカルフォルダを開く」から、そのフォルダを開く。(CMakeLists.txtのあるlibchdr内で一番上のフォルダ)
「CMake 生成が完了しました。」と出力されたら「CMake 設定エディターを開く」。
Configurationsの[+]をクリックして、"x86-Release"を追加。
Configuration typeを"Release"に変更。(RelWithDebInfoのままでも良いかもしれないが念のため…)
CMakeSettings.jsonを保存しなければ"x86-Release"へ切り替えられないのでCtrl+Sで保存。
"x86-Release"へ切り替え。「CMake 生成が完了しました。」と出力されるまで少し待つ。
CMakeSettings.jsonウィンドウ内下部の"Show advanced variables"にチェックを入れる。
CMAKE_C_FLAGS_DEBUG, CMAKE_C_FLAGS_MINSIZEREL, CMAKE_C_FLAGS_RELEASE, CMAKE_C_FLAGS_RELWITHDEBINFOの「/MD」を「/MT」に変更。(CMAKE_C_FLAGS_RELEASEだけで良い気がするが念のため全部)
Ctrl+SでCMakeSettings.jsonを保存してから、ビルド開始。
上記手順で下記2つのスタティックライブラリが作成されました。
\out\build\x86-Release\chdr-static.lib
\out\build\x86-Release\deps\lzma-22.01\lzma.lib
zlib.libもほしいのですが\out\build\x86-Release\deps\zlib-1.2.12にはdllのみでlibが作成されていませんでした。
zlibのビルド
CMakeでの設定でchdr-static.lib,lzma.libと同時にzlib.libも作成されるように変更できるのかも知れませんが、良くわからなかったので手動でzlib.libを作成します。
Visual Studio 2022を起動。「ローカルフォルダを開く」から"\deps\zlib-1.2.12"を開きlibchdrと同様の手順でビルドします。(/MDから/MTへの変更も含めて、すべて同様の手順)
これでzlib.libも手に入りました。
\deps\zlib-1.2.12\out\build\x86-Release\zlib.lib
libchdrの利用
libchdrのソース中にあるincludeディレクトリ以下のファイルを適当にコピーして、そのディレクトリをOotakeのプロジェクトの「追加のインクルード ディレクトリ」に追加。
include
+---dr_libs
| dr_flac.h
|
\---libchdr
bitstream.h
cdrom.h
chd.h
chdconfig.h
coretypes.h
flac.h
huffman.h
今回の手順で作成した3つのスタティックライブラリを適当なディレクトリにコピーして、そのディレクトリをOotakeのプロジェクトの「追加のライブラリディレクトリ」に追加。
lib
chdr-static.lib
lzma.lib
zlib.lib
\tests\benchmark.cを参考にchd.hをインクルードし、3つのライブラリをリンクするようにすれば、chd.hに定義されている各種関数が利用可能となります。
#include <libchdr/chd.h>
#pragma comment( lib, "zlib" )
#pragma comment( lib, "lzma" )
#pragma comment( lib, "chdr-static" )
....