はじめに
DXライブラリって静的リンクライブラリですよね。(C#用DLLを除く)
ですから、DXライブラリを使うexeを複数作るときファイルサイズが馬鹿でかくなっちゃいます。DLLにすれば、共通部分を抜き出していますからファイルサイズを抑えることができます。
この記事はそんなDXライブラリDLL化の奮闘をまとめたものです。
方針
アップデートに迅速に対応したかったので、GitHub Actionsのファイルの変数をいじるだけでDLLを作成しようとしました。
DXライブラリはC++用のものなので、そのままコンパイルすると各コンパイラが名前修飾した関数が含まれたDLLが出力されます。例えば、VisualStudioでDLLを作ることができても、MinGWでは使えません。これを防ぐには、DXライブラリコンパイル時にDX_COMPILE_TYPE_C_LANGUAGE
マクロを有効にする必要があります。
必要なライブラリ
DXライブラリは外部ライブラリを多用しており、外部ライブラリに依存するコードはすべてDxUseCLib*.cpp
・WIndows/DxUseCLib*.cpp
に記述されています。
DxUseCLib スタティックライブラリについて.txt
によると、
- Bullet Physics
- libpng
- zlib
- libjpeg
- libtiff
- libogg
- libvorbis
- libtheora
- libopus
- libopusfile
こいつらを全部コマンドラインでビルドできるようにするのは面倒です。
特に、Bullet Physicsに関しては、名前空間衝突回避のため全関数・型にD_
プレフィックスを付けてコンパイルしたLibファイルを使用したそうで、リネーム用プログラムがBulletのver2.75にのみ対応という曲者仕様でした。
他のライブラリはDLLを得るのにさほど苦労しませんでしたが、コイツのせいで挫折します。
最終兵器MSYS2
嗚呼、aptのようにコマンド一つでコンパイル済みのライブラリが手に入ったらいいのにと思っていたところ、思い出しました、MSYS2のpacman!
こいつのお陰で必要なライブラリのDLLのビルドが不要になり、ちゃっちゃとMakefileを記述するだけですみました。
Bullet問題
名前空間の衝突回避のためD_
をしたそうですが、別にやる必要なくね??ということでD_
プレフィックスを除去するヘッダを記述。これによりv2.75に依存しなくて済みました。
Vorbisのヘッダがない問題
pacmanで導入したlibvorbisには必要なヘッダがありませんでした。おそらく古いバージョンでは存在したヘッダだと思われます。入手が面倒だったのでdxlib-for-linuxから借用。
リポジトリ&ダウンロード
https://github.com/777shuang/DxLib.dll
Releasesにビルド済みDLLがアップロードされています。
使用方法
長くなりましたが、これを使うときにも DX_COMPILE_TYPE_C_LANGUAGE
を定義し、DxLib-3_24b.dll
をリンクする必要があります。