Modern C++ Conan Template は、Conan 2.x による外部パッケージ管理を統合した C++17 プロジェクトテンプレートです。
modern-cpp-template-learnkit をベースに、実務でよく使われる外部ライブラリ(spdlog / libpqxx / cxxopts / nlohmann_json / libsodium)を vendor 化して git で管理する仕組みを追加しています。
クローン直後から Conan 不要でビルドできる自己完結型の環境を実現します。
C++プロジェクトでの外部ライブラリ管理には、以下のような課題があります:
- 環境依存の問題: 開発者ごとにライブラリのバージョンや場所が異なりビルドが通らない
- CI/CD 環境でのセットアップ: 毎回ライブラリをインストールする手間とキャッシュ設定
- ヘッダオンリーライブラリの手動コピー: git に直接コミットする運用の煩雑さ
- Conan 習得コスト: チームメンバー全員が Conan を知らなくてもビルドできるようにしたい
このテンプレートでは Conan 2.x の vendor 機能を使って、取得したパッケージを vendor/ に展開し git で管理します。
vendor/ はリポジトリにコミット済みのため、クローン直後から Conan 不要でビルドできます。
| パッケージ | バージョン | 種別 | 用途 |
|---|---|---|---|
spdlog |
1.12.0 | コンパイル済み (.a) | 高速ロギングライブラリ |
libpqxx |
7.7.5 | コンパイル済み (.a) | PostgreSQL C++ クライアント |
cxxopts |
3.1.1 | header-only | コマンドライン引数パーサ |
nlohmann_json |
3.11.3 | header-only | JSON パーサ・シリアライザ |
libsodium |
1.0.20 | コンパイル済み (.a) | 暗号化・署名・ハッシュライブラリ |
全パッケージは shared=False(スタティックリンク)で埋め込まれるため、実行バイナリ単体で動作します。
| ツール | バージョン | 用途 |
|---|---|---|
| CMake | 3.15 以上 | ビルドシステム |
| GCC | 11 以上 | C++17 コンパイル |
| Google Test | 1.14(/opt/gtest/gtest-1.14) |
ユニットテスト |
| ツール | バージョン | 用途 |
|---|---|---|
| Python | 3.9 以上 | Conan 実行環境 |
| pip | 21 以上 | Conan インストール |
注意: 本リポジトリをクローンしてビルドする場合は不要です(
vendor/がリポジトリに含まれているため)。パッケージを追加・更新する場合のみ必要です。
vendor/ はリポジトリに含まれているため、Conan のセットアップは不要です。
git clone https://github.com/sumimi/modern-cpp-conan-template.git
cd modern-cpp-conan-template
# cmake 構成(vendor/conan_toolchain.cmake を指定)
cmake -S . -B build -DCMAKE_TOOLCHAIN_FILE=vendor/conan_toolchain.cmake
# ビルド
cmake --build build
# 実行
./build/bin/main
# テスト
cmake --build build --target run_testsconanfile.txt を変更した後、以下の手順で vendor/ を再生成してコミットします。
# Conan セットアップ(パッケージ取得 + vendor/ 再展開)
bash tools/conan_setup.sh
# vendor/ の変更をコミット
git add vendor/ CMakeUserPresets.json conanfile.txt
git commit -m "build: :package: Conan vendor パッケージを更新"
# ビルド
cmake -S . -B build -DCMAKE_TOOLCHAIN_FILE=vendor/conan_toolchain.cmake
cmake --build build詳細な手順は docs/CONAN_SETUP.md を参照してください。
パターン C:既存プロジェクトへの Conan 統合(modern-cpp-template-learnkit の例)
modern-cpp-template-learnkit のような既存の CMake プロジェクトに後から Conan を追加する手順です。
⚠️ テンプレートの全ファイルをコピーすると既存のソースコードや CMake 設定が上書きされます。
Conan 関連ファイルのみを選択的にコピーしてください。
まず、このテンプレートを一時領域にクローンし、Conan 関連ファイルのみを既存プロジェクトにコピーします。
# テンプレートを一時領域にクローン
git clone https://github.com/sumimi/modern-cpp-conan-template.git /tmp/conan-template
# 既存プロジェクトに移動(例: modern-cpp-template-learnkit)
cd /path/to/modern-cpp-template-learnkit
# Conan 関連ファイルをコピー
cp /tmp/conan-template/conanfile.txt .
cp /tmp/conan-template/requirements.txt .
cp -r /tmp/conan-template/profiles/ .
cp /tmp/conan-template/tools/conan_setup.sh tools/
# vendor/ ディレクトリ(Conan 展開先)を作成
mkdir -p vendor
touch vendor/.gitkeepコピーするファイル / ディレクトリ:
| ファイル | 用途 |
|---|---|
conanfile.txt |
パッケージ依存定義(必要に応じてカスタマイズ) |
requirements.txt |
Conan バージョン固定 |
profiles/linux-rhel9 |
Conan ビルドプロファイル |
tools/conan_setup.sh |
Conan セットアップスクリプト |
コピーしてはいけないファイル / ディレクトリ:
| ファイル / ディレクトリ | 理由 |
|---|---|
CMakeLists.txt |
既存プロジェクトの設定が上書きされる(手動で変更する) |
src/ |
既存のソースコードが上書きされる |
include/ |
既存のヘッダファイルが上書きされる |
test/ |
既存のテストコードが上書きされる |
README.md / LICENSE |
プロジェクト固有ファイル |
既存の CMakeLists.txt に Conan 関連の設定を追加します。
(a)Conan 関連設定を一括追加(project(...) 宣言の直後):
設定を1か所にまとめることで、マージ作業が1ステップで完了します。
CMAKE_BUILD_TYPEは Conan CMakeDeps が必須とするため、project()の直後に設定します。
# -----------------------------------------------------------------------------
# CMAKE_BUILD_TYPE のデフォルト設定
# Conan CMakeDeps が生成するファイルは CMAKE_BUILD_TYPE の設定を必須とする。
# 未指定の場合は Release をデフォルトとして設定する。
# -----------------------------------------------------------------------------
if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
set(CMAKE_BUILD_TYPE Release CACHE STRING "Build type" FORCE)
set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release" "MinSizeRel" "RelWithDebInfo")
endif()
# -----------------------------------------------------------------------------
# ライブラリ形式の選択肢:STATIC or SHARED(デフォルトは STATIC)
#
# SHARED を選択すると、動的ライブラリ(DLL)としてビルドされます。
# cmake -DBUILD_SHARED_LIBS=ON -S . -B build_shared
# -----------------------------------------------------------------------------
option(BUILD_SHARED_LIBS "Build libraries as shared (DLL) or static" OFF)
# -----------------------------------------------------------------------------
# IntelliSense 向け compile_commands.json の生成
# -----------------------------------------------------------------------------
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
# =============================================================================
# Conan vendor パッケージ設定
#
# vendor/conan_toolchain.cmake を使用して find_package を解決する。
# cmake 構成時にツールチェーンファイルを指定すること:
# cmake -S . -B build -DCMAKE_TOOLCHAIN_FILE=vendor/conan_toolchain.cmake
# 初回セットアップ: bash tools/conan_setup.sh を実行後、vendor/ を git commit。
# 以降のビルドでは Conan 不要(詳細: docs/CONAN_SETUP.md)。
# =============================================================================
if(NOT EXISTS "${CMAKE_SOURCE_DIR}/vendor/conan_toolchain.cmake")
message(FATAL_ERROR
"[Conan] vendor/conan_toolchain.cmake が見つかりません。\n"
"以下のコマンドで初回セットアップを行ってください:\n"
" bash tools/conan_setup.sh\n"
"詳細は docs/CONAN_SETUP.md を参照してください。"
)
endif()
find_package(spdlog REQUIRED)
find_package(cxxopts REQUIRED)
find_package(libpqxx REQUIRED)
find_package(nlohmann_json REQUIRED)
find_package(libsodium REQUIRED)(b)test/CMakeLists.txt の target_link_libraries に Conan パッケージを追加:
target_link_libraries(unit_tests PRIVATE
GTest::gtest
GTest::gtest_main
GTest::gmock
GTest::gmock_main
sampleapp
spdlog::spdlog
cxxopts::cxxopts
libpqxx::pqxx
nlohmann_json::nlohmann_json
libsodium::libsodium
)IntelliSense が Conan パッケージのヘッダを認識するには、cmake が生成する compile_commands.json を参照する設定が必要です。
.vscode/c_cpp_properties.json が存在しない場合は以下の内容で作成し、存在する場合は compileCommands 設定を確認・追加します:
{
"configurations": [
{
"name": "Linux",
"compileCommands": "${workspaceFolder}/build/compile_commands.json",
"compilerPath": "/usr/bin/gcc",
"cStandard": "c17",
"cppStandard": "c++17",
"intelliSenseMode": "linux-gcc-x64"
}
],
"version": 4
}
compile_commands.jsonは cmake 構成後(cmake -S . -B build ...)にbuild/ディレクトリに生成されます。VS Code を開き直すと IntelliSense が Conan パッケージのヘッダを自動認識します。
💡 Tip: cmake 構成後もインクルードエラーや警告が消えない場合は、VS Code のウィンドウを再読み込みしてください。
コマンドパレット(Ctrl+Shift+P)→Developer: Reload Window
.gitignore に以下を追加します(vendor/full_deploy/ は意図的に git 管理するため除外しないこと):
# Conan 2.x パッケージマネージャ
# ※ vendor/full_deploy/ は意図的に git 管理対象(vendor 化)
.conan/
.conan2/
graph_info.json
conaninfo.txt
conanbuildinfo.cmake
⚠️ 既存の.gitignoreにvendor/を除外するルール(例:vendor/)がある場合は削除してください。
modern-cpp-template-learnkit では include/cxxopts/ に cxxopts ヘッダを直接コミットしていました。
Conan での管理に切り替えた後は vendor/ に展開されるため、手動コピーしたものは不要になります:
# include/cxxopts/ を削除(Conan が vendor/ 経由で提供するため)
git rm -r include/cxxopts/# Conan セットアップ(初回のみ・インターネット接続が必要)
bash tools/conan_setup.sh
# 変更ファイルをステージ(vendor/ のコミットで以降 Conan 不要になる)
git add vendor/ CMakeUserPresets.json conanfile.txt requirements.txt profiles/ tools/conan_setup.sh .gitignore CMakeLists.txt .vscode/c_cpp_properties.json
git commit -m "build: :package: Conan vendor パッケージを追加"
# cmake 構成(Conan toolchain を指定)
cmake -S . -B build -DCMAKE_TOOLCHAIN_FILE=vendor/conan_toolchain.cmake
cmake --build build
# 動作確認
./build/bin/main
cmake --build build --target run_tests# 初期構成(Conan toolchain を指定)
cmake -S . -B build -DCMAKE_TOOLCHAIN_FILE=vendor/conan_toolchain.cmake
# ビルド
cmake --build build
# 実行
./build/bin/main
# テスト実行
cmake --build build --target run_tests
# カバレッジ測定(要 ENABLE_COVERAGE=ON)
cmake -DENABLE_COVERAGE=ON -S . -B build -DCMAKE_TOOLCHAIN_FILE=vendor/conan_toolchain.cmake
cmake --build build --target coveragemodern-cpp-conan-template/
├── conanfile.txt # パッケージ依存定義(git 管理)★
├── requirements.txt # Conan バージョン固定(git 管理)★
├── CMakeLists.txt # CMake ビルド設定
├── profiles/
│ └── linux-rhel9 # Conan ビルドプロファイル(git 管理)★
├── vendor/ # Conan 展開先(git 管理)★
│ ├── .gitkeep
│ ├── conan_toolchain.cmake # Conan 生成ツールチェーン
│ └── full_deploy/
│ └── host/
│ ├── spdlog/1.12.0/
│ ├── libpqxx/7.7.5/
│ ├── cxxopts/3.1.1/
│ ├── nlohmann_json/3.11.3/
│ └── libsodium/1.0.20/
├── include/
│ └── sampleapp/ # ヘッダファイル
├── src/
│ ├── main.cpp
│ └── sampleapp/ # 実装ファイル
├── test/
│ └── unit/
│ ├── sampleapp/ # サンプルアプリのテスト
│ └── packages/
│ └── ConanPackagesTest.cpp # 全パッケージ動作確認テスト★
├── tools/
│ ├── conan_setup.sh # Conan セットアップスクリプト★
│ └── ... # その他ビルド補助スクリプト
└── docs/
├── CONAN_SETUP.md # Conan 運用ガイド★
└── SETUP_GUIDE.md # 環境構築ガイド
★ = このテンプレートで追加した Conan 関連ファイル
conanfile.txt
│
▼
bash tools/conan_setup.sh
│
├─ pip install conan==2.7.1 (requirements.txt 固定)
├─ conan install --deployer=full_deploy
│ │
│ ├─ vendor/conan_toolchain.cmake ← CMAKE_PREFIX_PATH を設定
│ ├─ vendor/*Config.cmake ← find_package 解決用
│ └─ vendor/full_deploy/host/ ← headers + .a ライブラリ
│
└─ git add vendor/ && git commit
│
▼
cmake -S . -B build -DCMAKE_TOOLCHAIN_FILE=vendor/conan_toolchain.cmake
│
├─ find_package(spdlog)
├─ find_package(cxxopts)
├─ find_package(libpqxx)
├─ find_package(nlohmann_json)
└─ find_package(libsodium)
│
▼
cmake --build build → 実行バイナリ(全パッケージ静的リンク)
各パッケージが正しくリンク・動作することを確認するスモークテストが含まれています。
cmake --build build --target run_tests| テスト名 | 内容 |
|---|---|
SpdlogTest.LogsToOstreamSink |
spdlog のストリームシンクへの出力 |
SpdlogTest.LogLevelFilteringWorks |
ログレベルフィルタリング |
CxxoptsTest.ParsesStringOption |
コマンドライン引数のパース |
CxxoptsTest.DefaultValueUsedWhenOptionOmitted |
デフォルト値の適用 |
NlohmannJsonTest.ParsesJsonObject |
JSON オブジェクトのパース |
NlohmannJsonTest.SerializesJsonObject |
JSON シリアライズ |
NlohmannJsonTest.ThrowsOnInvalidJson |
不正 JSON の例外処理 |
LibsodiumTest.InitializeSucceeds |
libsodium の初期化 |
LibsodiumTest.RandomBytesGeneratesNonZeroOutput |
乱数生成 |
LibsodiumTest.Sha256HashIsConsistent |
SHA-256 ハッシュの再現性 |
LibpqxxTest.ZViewLinksAndWorks |
libpqxx ヘッダリンク確認(DB接続不要) |
-
conanfile.txtの[requires]にパッケージを追加する:[requires] spdlog/1.12.0 newpackage/x.y.z ← 追加 -
CMakeLists.txtにfind_packageを追加する:find_package(newpackage REQUIRED)
-
セットアップスクリプトを再実行して
vendor/を更新する:bash tools/conan_setup.sh git add vendor/ CMakeUserPresets.json conanfile.txt CMakeLists.txt git commit -m "build: :package: newpackage を Conan で追加"
詳細は docs/CONAN_SETUP.md を参照してください。
- Conan 2.x Documentation - C++ パッケージマネージャ
- Conan Center Index - 公式パッケージ検索
- Conan パッケージ管理ガイド(CONAN_SETUP.md) - Conan 2.x の導入・パッケージ管理・vendor 運用手順
- modern-cpp-template-learnkit - このテンプレートのベースとなった C++17 学習用スターターテンプレート
MIT License — 詳細は LICENSE を参照してください。
本テンプレートは自由に利用・改変・再配布が可能です。商用プロジェクトでも無償で使用できます。