Hello, vcpkg! / レイトレ合宿 11

>100 Views

November 16, 25

スライド概要

2025/11/14-11/16 に東京で開催されたレイトレ合宿 11 で発表したセミナー資料です。
CMake を既に使っているなら vcpkg でライブラリ導入するのが便利という意図のセミナー発表をしました。

サンプルプロジェクト (GitHub): https://github.com/Pheema/rtcamp2025-vcpkg-tutorials

X: Twitter: https://x.com/_Pheema_
レイトレ合宿 11: https://sites.google.com/view/rtcamp11

profile-image

ゲームプログラマーのようななにか

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

ダウンロード

関連スライド

各ページのテキスト
1.

レイトレ合宿 11 セミナー Hello, vcpkg! Pheema, レイトレ合宿 11 (2025)

2.

皆さん、C++ のライブラリ導入どうしてますか? /MD と /MT が混ざり全てが崩壊した LNK2038: 「RuntimeLibrary」の不一致が検出されました: 値「MDd_DynamicDebug」が foo.obj の値 「MTd_StaticDebug」と一致しません。 _ITERATOR_DEBUG_LEVEL の不一致に涙を流した エラー LNK2038: '_ITERATOR_DEBUG_LEVEL' の不一致が検出されました: 値 '0' は foo.obj の値 '2' と 一致しません。 exe の横に依存 DLL をコピーし忘れて静寂が訪れた foo.dll が見つからないため、コードの実行を続行できません。プログラ ムを再インストールすると、この問題が解決する 可能性があります。 そんなあなたに vcpkg を紹介します❗

3.

なぜ vcpkg か vcpkg add port で簡単にライブラリが導入できる CRT のリンク設定、デバッグ、リリースの不整合防止 依存関係の再現性(CI や後日ビルドしたときでも同じ結果を得たい)

4.

vcpkg とは Microsoft と C++ コミュニティーで開発を進めている C/C++ パッケージマネージャー(2016 年公開) 対応 OS: Windows, Linux, macOS Visual Studio 2022 17.6+ に同梱され IDE 連携も進んでいる 配布されているパッケージは vcpkg.io で検索できる

5.

vcpkg の使い方

6.

使い方の簡単なまとめ 1. vcpkg をインストールする 2. 設定ファイル ( vcpkg.json , vcpkg-configuration.json ) を生成する 3. CMakePresets.json を書く 4. CMakeLists.txt を書く 5. CMake で configure と build を実行する 🎉

7.

手順 1/5: vcpkg のインストール(Windows) おすすめ[1]: Scoop を利用してインストール(環境変数 VCPKG_ROOT も自動設定してくれる) 1 2 # vcpkg をインストール scoop install vcpkg Scoop 経由で導入すると、その後のアップデートも簡単に実行できる 1 2 # vcpkg のアップデートも簡単 scoop update vcpkg [1] 公式手順では GitHub から clone して bootstrap-vcpkg.bat を実行する手順が紹介されている (URL)

8.

手順 2/5: vcpkg の初期化とライブラリの追加 既存プロジェクトに vcpkg の設定ファイルを作成し、利用したいパッケージを追加する 1 2 3 4 5 6 7 8 # プロジェクトディレクトリに移動する cd hello-vcpkg # vcpkg の設定ファイル(vcpkg.json, vcpkg-configuration.json)を作成する vcpkg init --application # 依存ライブラリを追加する(例: fmt) vcpkg add port fmt

9.
[beta]
手順 2/5: vcpkg の初期化とライブラリの追加
vcpkg.json , vcpkg-configuration.json がディレクトリ内に新規作成される
baseline (vcpkg リポジトリのコミットハッシュ) が指定されていることに注意する [1]
baseline 指定有: そのコミット時点での各 ports を 最低ライン としてライブラリのバージョン解決がおこなわれる
baseline 指定無: 常に最新の ports が利用されてしまい、ビルドの再現性が失われる
vcpkg.json

1
2
3
4
5

[1] 古い

{

}

"dependencies": [
"fmt"
]

vcpkg-configuration.json

1
2
3
4
5
6
7
8
9
10
11
12
13
14

{

}

"default-registry": {
"kind": "git",
"baseline": "2d6a6cf3ac9a7cc93942c3d289a2f9c661a6f4a7",
"repository": "https://github.com/microsoft/vcpkg"
},
"registries": [
{
"kind": "artifact",
"location": "https://github.com/microsoft/...",
"name": "microsoft"
}
]

vcpkg.json で baseline がない場合は vcpkg x-update-baseline --add-initial-baseline で追記すると良いでしょう

10.
[beta]
手順 3/5: CMakePresets.json を作成する
CMAKE_TOOLCHAIN_FILE を指定することで CMake と vcpkg を連携させる
VCPKG_TARGET_TRIPLET (後述) でライブラリのビルド方針が決まる
それに応じて CMAKE_MSVC_RUNTIME_LIBRARY も適切に設定する必要がある
CMakePresets.json

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

{

"version": 10,
"configurePresets": [
{
"name": "x64-win-mt",
"generator": "Visual Studio 17 2022",
"binaryDir": "${sourceDir}/build/${presetName}",
"architecture": "x64",
"cacheVariables": {
"CMAKE_TOOLCHAIN_FILE": "$env{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake",
"VCPKG_TARGET_TRIPLET": "x64-windows-static",
"CMAKE_MSVC_RUNTIME_LIBRARY": "MultiThreaded$<$<CONFIG:Debug>:Debug>"
}
}
],
"buildPresets": [
{

11.

手順 4/5: CMakeLists.txt を作成する CMake の configure 時に vcpkg のライブラリが自動的にダウンロード、ビルドされる ビルドされたライブラリは find_package() でリンクすることができる find_package() で見つけたライブラリは target_link_libraries() で自分のプロジェクトへリンクできる CMakeLists.txt 1 2 3 4 5 6 7 8 9 10 11 12 13 cmake_minimum_required(VERSION 3.30) project(vcpkg-example LANGUAGES CXX) add_executable(hello-vcpkg) target_include_directories(hello-vcpkg PRIVATE include) target_sources(hello-vcpkg PRIVATE src/main.cpp) # vcpkg 経由でインストールされたライブラリを見つける find_package(fmt REQUIRED) target_link_libraries(hello-vcpkg PRIVATE fmt::fmt)

12.

手順 5/5: CMake で configure と build を実行する configure と build を実行するだけでライブラリのダウンロード、ビルド、インストールが自動的に行われる 🎉 DLL なども exe と同じディレクトリに自動的にコピーされる 1 2 3 4 5 6 7 8 # プロジェクトディレクトリに移動する cd hello-vcpkg # configurePresets を指定して configure を実行する (ビルドディレクトリに sln, vcxproj 等が生成される) cmake --preset x64-win-mt # buildPresets を指定してビルドを実行する cmake --build --preset x64-win-mt --config Release

13.

Triplet とは? vcpkg がライブラリをビルドする際の方針を決める設定プリセット Triplet が一致すればローカルのビルド済みバイナリを再利用できる vcpkg help triplet や vcpkg の GitHub などで triplet の一覧や各設定内容を確認できる 例: x64-windows vcpkg/triplets/x64-windows.cmake 1 2 3 set(VCPKG_TARGET_ARCHITECTURE x64) set(VCPKG_CRT_LINKAGE dynamic) set(VCPKG_LIBRARY_LINKAGE dynamic) 例: x64-linux vcpkg/triplets/x64-linux.cmake 1 2 3 4 5 set(VCPKG_TARGET_ARCHITECTURE x64) set(VCPKG_CRT_LINKAGE dynamic) set(VCPKG_LIBRARY_LINKAGE static) set(VCPKG_CMAKE_SYSTEM_NAME Linux)

14.

代表的な Windows 向け Triplet x64-windows vcpkg 経由のライブラリを動的リンクし、 CRT[1] も動的リンク (/MD) する 各ライブラリごとに DLL が生成される ( fmt.dll 等) ので、 DLL が多くなり管理が面倒に x64-windows-static vcpkg 経由のライブラリを静的リンクし、 CRT も静的リンク (/MT) する 自己完結しているプログラムなら配布が簡単になるが、動的リンク前提のライブラリが 1 つでも含まれると CRT の不整合に気を使う x64-windows-static-md [2] (⭐ 個人的おすすめ ) vcpkg 経由のライブラリを静的リンクし、 CRT は動的リンク (/MD) する 静的リンクできないライブラリがあったり外部 DLL(OptiX など) が必要な場合でも CRT の不整合が起きづらい レイトレ合宿の提出ではこれがバランス良さそう [1] CRT = C ランタイムライブラリ [2] Microsoft Learn の ドキュメント(2024/09/03 最終更新)上では Community 管理とされているが、 2024 年末のコミット で Built-in Triplets に昇格して CI でもテストされるようになった模様

15.

ここが辛いよ(個人の感想) そもそも CMake が難解で辛い デファクトスタンダードである以上そろそろ避けて通れない 最近は LLM の助けも借りられるようになってきたので以前よりはマシな気もする 欲しいライブラリが vcpkg に登録されていないことがある overlay ports を自分で用意する必要があるが、資料が少ない port の書かれ方がライブラリごとにまちまちで、望んだビルドフラグなどが設定されていない場合がある overlay ports を自分で用意するか、overlay triplets 経由でビルドオプションを追加する必要がある

16.

vcpkg を使って楽に[1]ライブラリを導入しよう❗ [1] 従来比

17.

参考資料 vcpkg vcpkg – Tutorial: Install and use packages with CMake

18.

サンプルプロジェクト (GitHub)

19.

レイトレ合宿 11 セミナー Hello, vcpkg! Pheema, レイトレ合宿 11 (2025)