はじめに
車輪の再開発は避けるべきと心がけており、実績があると思われているライブラリは積極的に再利用して効率よく開発をすべきだと考えています。
今回、janssonという、C言語用のJSONパーサーをWindows用バイナリとしてビルドしてみます。
ちなみに、車輪の再開発を否定しているわけではなく、より便利なものを作ろうという考えやそれにより知識を高めるというのは必要なことだとは思います。
ビルドの方法
C言語系のオープンソースのプロジェクトをビルドする場合、大体2つのパターンだと思います。
configure
太古の昔から使用されている方法。
以下のようにコマンドでビルドを行う。
$ ./configure [必要に応じていろいろオプション]
$ make
cmake
最近よくある方法。(最近といってもだいぶ昔だと思いますが...)
$ mkdir build
$ cd build
$ cmake ..
$ make
今回のjanssonの場合は、cofigureのパターンでした。
ビルド環境
linux環境でlinux用のバイナリをビルドするのであれば、何も悩むことなく、makeすればそれでおしまいですが、今回はWindows用のバイナリをビルドします。
そこで、ビルドには、msys2を使用しました。
msys2のどれを使う?
たぶん普通にダウンロードしてインストールできるかと思います。
ただ、msys2にはMSYS,MINGW,...といくつかの環境があり、どれを使って良いものかと疑問が発生します。
ありがたいことに、以下のページにその違いが記述されていました。
今回の私の目的を達成するには、MSYS2 UCRT64だと思われます。
janssonのビルド
早速、janssonをビルドしていきます。
ビルド
こんな感じで。
$ tar zxvf jansson-2.14.1.tar.gz ... ソース展開
$ cd jansson-2.14.1 ... フォルダ移動
$ ./configure --enable-shared --prefix=`pwd`/build ... makefile作成 & DLL用
$ make ... ビルド
$ make install ... ビルドしたファイルをコピー
DLLはどこにできる?
configureを実行するときに、--prefixで出力先を設定していました。
今回の場合、jansson-2.14.1/build にビルド結果が出力されます。
├─bin
│ └─ libjansson-4.dll ... ビルドしたDLL
├─include
│ └─ *.h
└─lib
└─ libjansson.dll.a ... リンク用のlib
ビルドしたDLLを自分のプログラムに組み込み、早速動作させてみます...
いつものパターンですが、はいダメです。
原因(依存関係)を調べる。
大抵のケースで依存関係となるDLLが不足しているのが原因と思われ、調べてみます。
MSYS2のターミナルで以下のコマンドで確認します。
$ ldd libjansson-4.dll
ntdll.dll => /c/WINDOWS/SYSTEM32/ntdll.dll (0x7ffd5dc40000)
KERNEL32.DLL => /c/WINDOWS/System32/KERNEL32.DLL (0x7ffd5d3e0000)
KERNELBASE.dll => /c/WINDOWS/System32/KERNELBASE.dll (0x7ffd5b4c0000)
msvcrt.dll => /c/WINDOWS/System32/msvcrt.dll (0x7ffd5c330000)
ucrtbase.dll => /c/WINDOWS/System32/ucrtbase.dll (0x7ffd5b8c0000)
libwinpthread-1.dll => /ucrt64/bin/libwinpthread-1.dll (0x7ffd3d430000)
advapi32.dll => /c/WINDOWS/System32/advapi32.dll (0x7ffd5c930000)
sechost.dll => /c/WINDOWS/System32/sechost.dll (0x7ffd5c280000)
RPCRT4.dll => /c/WINDOWS/System32/RPCRT4.dll (0x7ffd5d660000)
CRYPTBASE.DLL => /c/WINDOWS/SYSTEM32/CRYPTBASE.DLL (0x7ffd5a300000)
bcryptPrimitives.dll => /c/WINDOWS/System32/bcryptPrimitives.dll (0x7ffd5add0000)
怪しいのが1ついます。libwinpthread-1.dllですね。
このファイルを早速自分のEXEがあるフォルダにコピーし再度実行。
無事動作しました。
おわりに
janssonは比較的簡単にバイナリを作れました。
すべてのオープンソースが上手く行くわけではないですが、MSYS2が非常に便利な環境であることは確かです。
