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" )

....

 

patch