vcpkg を使ってみた

vcpkg という、 Microsoft が Visual C++ 向けに作っている(つまり、基本的にはライブラリをパッケージングするための)パッケージシステムがあります。

私は UtVideo のユニットテスト部分で boost と ffmpeg を使っているのですが、手打ちでビルドしていてかなりめんどくさいし、他人が UtVideo をビルドしようとした時に輪をかけてめんどくさいことになることが想像されるため、これが簡単になることを期待しています。

パッケージシステム自体のインストールはこんな感じです。簡単。

git clone https://github.com/Microsoft/vcpkg.git
cd vcpkg
bootstrap-vcpkg.bat
vcpkg integrate install     < - Visual C++ に統合する場合

Visual C++ に統合すると、以下のような挙動になります。

  1. デフォルトのインクルードパスに、パッケージのヘッダファイルがインストールされるディレクトリが追加される。
  2. デフォルトのライブラリパスに、パッケージのライブラリ(スタティックライブラリパッケージの場合はスタティックライブラリ、DLL パッケージの場合はインポートライブラリ)がインストールされるディレクトリが追加される。デバッグビルドかリリースビルドかは自動判定される。
  3. デフォルトのライブラリ依存関係に、インストールされているライブラリが基本的に全て追加される(シンボルが衝突するものが含まれる場合は明示的に指定する必要がある)。
  4. DLL にリンクする場合、プロジェクトの出力ディレクトリにリンクした DLL がコピーされる。

1と2は普通の動作だと思うのですが、3と4が面白いです。3のおかげでどのライブラリを使っているか意識する(追加のライブラリにずらずらと指定する)必要がなくなります。これはスタティックライブラリを使う場合に特に利点となります(考え方によっては欠点でもある)。4のおかげでDLLのあるディレクトリにパスを通す必要がなくなります。これは x64 と x86 で同じ名前の DLL がある場合にテスト実行時にパスを切り替える必要が無いということでもあります。

パッケージをビルド&インストールするには以下のようにします。 Windows の場合 Unix like OS と違ってライブラリを配置する標準的なディレクトリというものがないので、インストール先は vcpkg のディレクトリの下にある installed ディレクトリになります。

vcpkg install パッケージ名 ...
vcpkg --triplet triplet install パッケージ名 ...
vcpkg install パッケージ名:triplet ...

triplet というのは環境を表す文字列で、今の vcpkg では以下がサポートされているようです。すべて同居できます。(vcpkg\installed\x64-windows みたいなディレクトリになる)

  • x86-windows
  • x86-windows-static
  • x64-windows
  • x64-windows-static
  • x86-uwp
  • x64-uwp
  • arm-uwp

windows が含まれているのが Windows デスクトップアプリ向けで、 uwp が含まれているのがユニバーサルWindowsプラットフォームアプリです。 -static が含まれるのはライブラリ自身もランタイムもスタティックで、含まれないのはライブラリ自身もランタイムもDLLです。ライブラリ自身がスタティックでランタイムがDLLなのはサポートされていないようです。

Visual C++ プロジェクト側からどの triplet を使うかは自動判定されるそうですが、スタティック版が使われるか DLL 版が使われるかは今のところ自動判定されないらしく、常に DLL 版になってしまいます。これに対処するには .vcxproj ファイルを手書きで修正しなければいけません(ここの一番下)


さて、とりあえず boost と ffmpeg を使いたいのでビルドします。

vcpkg install boost:x86-windows boost:x86-windows-static boost:x64-windows boost:x64-windows-static ffmpeg:x86-windows ffmpeg:x86-windows-static ffmpeg:x64-windows ffmpeg:x64-windows-static

ビルドに3時間かかってました。

UtVideo をチェックアウトしてきて、tests プロジェクトで明示的に指定していた追加のインクルードディレクトリと追加のライブラリディレクトリと追加の依存ファイルを削除して(それぞれ「親またはプロジェクトの規定値から継承」がチェックされていることを確認)、ついでに DLL プロジェクトに変更してビルドしてみると…あっさりビルドできます。

楽だ。


ところで vcpkg integrate install ですが、ドキュメント によると Visual C++ 2015/2017 の両方に統合されるらしく、バージョンによって vcpkg を分けることができないように見えます。これ不便だったりしないのかなぁ…問題があったらとっくに修正されてるだろうから問題ないんだろうか。

Trackback

no comment untill now

Add your comment now