C++用パッケージマネージャ「vcpkg」をVisual Studioに統合する

C/C++

C++開発進めていくために、Visual Studioとvcpkgを使ってパッケージ管理を行う方法です。
基本的にはMSのドキュメントベースで進めますが、所々でハマりやすいポイントもあるので、より詳細な解説を入れながら進めようと思います。

Visual Studio で MSBuild でパッケージをインストールして使用する
チュートリアルでは、MSBuild と Visual Studio でパッケージをインストールして使用するプロセスについて説明します。

vcpkgを設定する

事前準備

既にvisual studio installerでvcpkgが入っている場合は、今後の手順で競合が発生してしまうため、チェックを外しておいてください。

gitでvcpkgリポジトリをクローン

git clone https://github.com/microsoft/vcpkg.git
注意点

クローン先のフォルダはどこでもいいですが、フォルダ階層が深すぎるとWindowsでよくあるパスが長すぎてエラーになる可能性があるため、なるべくCドライブ近くがおすすめです。

ブートストラップスクリプトを実行

batファイルを実行して実行ファイル(vcpkg.exe)をダウンロードします。

cd vcpkg && bootstrap-vcpkg.bat

実行すると以下の結果が出力されます。

Validating signature... done.

vcpkg package management program version 2024-04-23-d6945642ee5c3076addd1a42c331bbf4cfc97457

See LICENSE.txt for license information.
Telemetry
---------
vcpkg collects usage data in order to help us improve your experience.
The data collected by Microsoft is anonymous.
You can opt-out of telemetry by re-running the bootstrap-vcpkg script with -disableMetrics,
passing --disable-metrics to vcpkg on the command line,
or by setting the VCPKG_DISABLE_METRICS environment variable.

Read more about vcpkg telemetry at docs/about/privacy.md

Visual Studioと統合

Windowsのみ、以下のコマンドでVisual Studioとvcpkgを統合することができます。

vcpkg.exe integrate install

実行すると以下の結果が出力されます。

All MSBuild C++ projects can now #include any installed libraries. Linking will be handled automatically. Installing new libraries will make them instantly available.

環境変数を設定する

VCPKG_ROOTを設定する

Windowsの環境変数に「VCPKG_ROOT」を追加します。
値はクローンしたvcpkgリポジトリまでのフォルダパスです。
これを追加することでVisual Studioが内部で使用するvcpkgを見つけることができます。

PATHにvcpkgを追加する

Windowsの環境変数の「PATH」にvcpkgフォルダも追加します。
今後vcpkgコマンドを叩くことが多いのでここでやっておきます。

Visual Studio プロジェクトを設定する

C++プロジェクトの用意

私はVcpkgProjectというC++のプロジェクトを作成したので、皆さんは自身のプロジェクトに読み替えて進めてください。
今後の作業はプロジェクト配下でコマンドを実行していくのでcdコマンドで移動しておきます。

cd VcpkgProject

vcpkgの初期化

以下のコマンドを実行する。

vcpkg new --application

これでプロジェクトフォルダにvcpkg.jsonファイルが出来上がります。

vcpkgにはクラシックモードと、新しく追加されたマニフェストモードがあり、vcpkg.jsonはマニフェストモードで機能するファイルです。
MS推奨はマニフェストモードのため、マニフェストモードで進めていきます。

vcpkg.json

vcpkg.jsonファイルはnpmがわかる方にはpackage.jsonファイルと同じといえば伝わるかなと思います。
詳細については以下を参照。
https://learn.microsoft.com/ja-jp/vcpkg/reference/vcpkg-json

プロジェクトをマニフェストモードに変更する

プロジェクトの「プロパティ>vcpkg>Use Vcpkg Manifect」の設定を「はい」に変更します。
もしサイドバーに「vcpkg」の項目が表示されていなければ、一度Visual Studioを再起動します。

vcpkgパッケージを使用するプロジェクトは全てこの手順が必要なため、忘れるとパッケージが参照できずエラーになります。

パッケージのインストール

プロジェクトルートでインストールコマンドを実行します。今回はfmtパッケージをインストールしてみます。

パッケージの検索

searchコマンドを使えばパッケージの存在チェックが行えます。

vcpkg search fmt

実行するとかなり時間はかかりましたが(3分くらい?)、部分一致したパッケージのリストが表示されました。2回目以降はもう少し早くなります。

Fetching registry information from https://github.com/microsoft/vcpkg (HEAD)...
fmt                      10.2.1#2         {fmt} is an open-source formatting library providing a fast and safe alter...
loguru[fmt]                               Build with fmt support in non-header-only mode
mp-units[use-libfmt]                      Use libfmt instead of std::format
rivers[fmt]                               Use fmt as rivers fommatter
serdepp                  0.1.4.1          c++ 17 universal serialize deserialize library like rust serde, support li...
stronk[fmt]                               Dependencies for fmt extension

ちなみに全てのパッケージは下記のサイトで確認できます。

vcpkg/ports at master · microsoft/vcpkg
C++ Library Manager for Windows, Linux, and MacOS. Contribute to microsoft/vcpkg development by creating an account on G...

パッケージの追加

vcpkgでは、vcpkg.jsonファイルにパッケージ名を追記することで、依存関係を管理できます。
直接書き込むこともできますが、addコマンドを使うこともできます。

vcpkg add port fmt

実行するとvcpkg.jsonファイルが以下の内容に書き換わります。

{
  "dependencies": [
    "fmt"
  ]
}

パッケージのインストール

以下のコマンドでvcpkg.jsonに書かれているパッケージがインストールされます。

vcpkg install

ただし、この手順は飛ばしたとしても、既にvisual studioとvcpkgが統合されているので、プロジェクトをビルドすると勝手にこのコマンドが実行されます。

インストールされたパッケージの確認

以下のコマンドでインストールされているパッケージ一覧を確認できます。

vcpkg list

実行するとfmtパッケージが表示されます。

fmt:x64-windows  10.2.1#2   {fmt} is an open-source formatting library provi...

パッケージの動作確認

fmtパッケージの動作を確認するためだけのコードを追加しました。

#include <fmt/core.h>

int main()
{
    fmt::print("Hello World!\n");
}

コード追加時点ではfmtが見つからないと赤線が表示されるのですが、実行は可能です。

私の場合はVisual Studioの再起動で赤線が消えました。

ここまででvcpkgでインストールしたパッケージを使用することができました。

パッケージの削除

vcpkg.jsonのdependenciesから対象のパッケージを削除して、vcpkg installコマンドを実行することで削除することができます。

{
  "dependencies": [
  ]
}
vcpkg install

削除されたかどうかはvcpkg listコマンドで確認してみてください。

その他注意点

パッケージによってはインストールできないものもある

例えば、vincentlaucsb-csv-parser(csv-parser)ライブラリをインストールしてみます。

vcpkg add port vincentlaucsb-csv-parser
vcpkg install

すると以下のエラーが表示されます。

error: building vincentlaucsb-csv-parser:x64-windows failed with: BUILD_FAILED

こういったエラーが発生する理由はわかりませんが、おそらくパッケージがプラットフォームに対応していないのかなと思います。

おわりに

以上がC++開発のためのVisual Studioとvcpkgを統合する方法でした。
使用方法自体はnpmとほとんど変わりませんが、npmでは発生しないような問題やハマりポイントがいくつかあったので、今回記事に作成してみました。

タイトルとURLをコピーしました