📦

vcpkgのマニフェストモードがかなり良い

2023/09/04に公開

vcpkgとマニフェストモード

C++のパッケージマネージャとして、vcpkgが有名です。コマンドラインからvcpkg install xxxとするだけでライブラリをインストールできるのでかなり楽です。ただし、この方法だとマシンにグローバルにインストールされてしまうという問題があります。

それに対して、マニフェストモードでは、vcpkg.jsonというファイルを作成することで、ディレクトリごとにライブラリをインストールできるようになります。さらに、ライブラリのバージョン指定も可能のようです。使い方も簡単で便利なのでおすすめです。

CMakeと一緒に使ってみる

ここからは、vcpkg(マニフェストモード) + CMakeでプロジェクトを作成する方法を紹介します。

必要なファイルはmain.cppvcpkg.jsonCMakeLists.txtの3つです。

example_project
- main.cpp
- vcpkg.json
- CMakeLists.txt

main.cppでは、有名なロギングライブラリであるspdlogを使うことにします。

#include <spdlog/spdlog.h>

int main() {
    spdlog::info("Hello, World!");
}

次にvcpkg.jsonを作成し、spdlog"dependencies"に書きます。

{
    "$schema": "https://raw.githubusercontent.com/microsoft/vcpkg/master/scripts/vcpkg.schema.json",
    "name": "example",
    "version-string": "1.0.0",
    "dependencies": [
        "spdlog"
    ]
}

CMakeで自動的にライブラリをインストールできるようにします。

# 基本設定
cmake_minimum_required(VERSION 3.16)
project(Example LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 20)

# spdlogをリンクする
find_package(spdlog CONFIG REQUIRED)
add_executable(Example main.cpp)
target_link_libraries(Example PRIVATE spdlog::spdlog)

準備はこれだけです。cmakeを走らせるときは、以下のようにオプションでパスを与えます。

cmake . -B build -D CMAKE_TOOLCHAIN_FILE=C:\vcpkg\scripts\buildsystems\vcpkg.cmake

これで実際にビルドして実行してみると、しっかりspdlogが使えていることが確認できました。

基本はこれだけです。

featuresの書き方

ライブラリによっては、追加の"features"を指定することもできます。たとえば、ImGuiで対応したいプラットフォームの機能を指定する場合、以下のように書けます。

{
  "$schema": "https://raw.githubusercontent.com/microsoft/vcpkg/master/scripts/vcpkg.schema.json",
  "name": "example",
  "version-string": "1.0.0",
  "dependencies": [
    "spdlog",
    {
      "name": "imgui",
      "features": ["glfw-binding", "vulkan-binding", "docking-experimental"]
    }
  ]
}

おわり

vcpkgのマニフェストモードを使えばファイル一つで環境を共有できるので、他人にもやさしくなれます。

Discussion