LoginSignup
4
0

はじめに

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*.cppWIndows/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をリンクする必要があります。

4
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0