vcpkgとCMakeを用いてライブラリを管理する方法について述べる。
私は普段VSCodeとGCCのコンパイラを用いてプログラミングを行っている。その環境でvcpkgを用いてライブラリ管理を行う際の方法について記す。
クラシックモードについてのざっくり理解
クラシックモードとは、VCPKG_ROOTフォルダの子フォルダにライブラリをインストールして用いる方法である。
VCPKG_ROOT/(triplet名)/にincludeやlibなどといったフォルダがあり、そこにライブラリが保存されることになる。
丸投げ
大体は上の記事の通りだ。私が書いているこの記事は、上のリンクの記事と並行して読むことを前提としているし、やり方の8割は上の記事に書いてある。ただ、上の記事はマニュフェストモードでの動作であり、後述の通り少しやり方が違う部分がある。ハマったポイントもあったので、忘れないうちにメモしておきたい。
記事との差異
先ほどリンクを貼った記事と、どういう点でやり方が違うのか書いておく。
マニフェストファイルを作らなくてよい
先ほどの記事では、「3 - 依存関係とプロジェクトファイルを追加する」の「1.」でマニフェストファイルを作成している。しかし、クラシックモードではマニフェストモードとは異なり、マニフェストファイルを作る必要がない。
なので、「マニフェスト ファイルを作成し、 fmt 依存関係を追加します。」のところは飛ばしてよい。
自分でライブラリをインストールしなくてはならない
クラシックモードでは、あらかじめvcpkgを用いてライブラリをインストールしておく必要がある。パッケージのインストールの際には正しいTripletを指定する必要がある。マイクロソフトのページによれば、Tripletとは以下のようなものだ。
tripletは、ターゲットのビルド環境 (cpu、os、コンパイラ、ランタイムなど) を 1 つの便利な名前でキャプチャします。 vcpkg は既定で 70 を超えるトリプレットを提供しますが、独自のトリプレットを定義することもできます。
自分の環境の場合は、コマンドラインに以下のように入力すればよかった。
vcpkg install fmt:x64-mingw-dynamic
ここでは、x64-mingw-dynamicがTripletだ。正しいTripletを指定しないと、様々な問題が発生することになる。開発環境によって指定すべきTripletは異なるので、各自で調べてみてほしい。ちなみに、私の環境では、windowsのPCでmingwのg++コンパイラを用いて開発を行っている。
ハマったポイント:CMakePresetsにおけるTripletの指定漏れ
マニュフェストモード、クラシックモード双方に言えることだが、コンパイルの際に自分の環境に対応した適切なTripletが指定されていないと、以下のようなエラーが出る。
Tripletはライブラリのインストールだけでなく、コンパイル時にも必要になるのだ。
undefined reference to \`__imp__ZN3fmt3v116vprintENS0_17basic_string_viewIcEENS0_17basic_format_argsINS0_7contextEEE'
これを解決するのには、以下の内容が役に立った。
【結論】
この記事の内容を踏まえて、実行する環境に合わせてCMakePresets.jsonを以下のように変更した。
{
"version": 2,
"configurePresets": [
{
"name": "vcpkg",
"generator": "Ninja",
"binaryDir": "${sourceDir}/build",
"cacheVariables": {
"CMAKE_TOOLCHAIN_FILE": "$env{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake",
"VCPKG_TARGET_TRIPLET": "x64-mingw-dynamic"
}
}
]
}
先述の通り、環境によって指定すべきTripletは異なるので、注意してほしい。
【別解】VSCodeの設定から変更する方法
vsCodeの設定から,以下の部分を変更することでも目的を達成できた.入力する項目は上に記したものと同じである.

【コラム的なもの】結局のところ、これは何を設定しているのか
CMakeは、コマンドラインから呼び出されることが多いが、今回はCMakePresets.jsonなどという得体のしれないファイルを設定し、VSCodeに任せて実行した。では、ここで行ったような内容の操作をコマンドライン上で行うには、どのようにすればよいのだろうか。
答えは以下のようなものになる。(多分。違ったらすみません)
cmake . -G"Ninja" -DCMAKE_TOOLCHAIN_FILE %VCPKG_ROOT%/scripts/buildsystems/vcpkg.cmake -VCPKG_TARGET_TRIPLET x64-mingw-dynamic
結局のところ、特別なことは何もしておらず、CMakePreset.jsonを使ってCMakeの引数を指定しているにすぎないのだ。
私が遭遇したエラー
Tripletを適切に設定しなかった際に、以下のようなエラーが出た。これは、rtmidiというライブラリを使おうとした際に起きたものである。
CMake Error at C:/vcpkg/scripts/buildsystems/vcpkg.cmake:893 (_find_package):
Could not find a package configuration file provided by "rtmidi" with any of the following names:
rtmidiConfig.cmake
rtmidi-config.cmake
Add the installation prefix of "rtmidi" to CMAKE_PREFIX_PATH or set "rtmidi_DIR" to a directory containing one of the above files. If "rtmidi" provides a separate development package or SDK, be sure it has been installed.
このような状況にはまってしまい、上記のような方法でTripletを指定することで解決を試みてもうまくいかない場合、buildディレクトリを削除してやり直すとうまくいくことがある。
追記: x64-mingw-dynamicに設定した状態でライブラリをダウンロード、ビルドできないというエラー
vcpkgでライブラリをインストールしようとしたときに、「failed with: BUILD_FAILED」のようなエラーが出てダウンロードできないといったことが発生した。調べてみると、以下のサイトで似た症状が報告されており、解決策も提示されていた。
どうやら古いAnacondaのアンインストールが上手くいっていなかったのが原因のようだ。
しかし、私はこの方法ではうまくいかなかった。
仕方がないのでWindowsを再インストールしたところ、うまくいった。