適切なCMakeプロファイルを提供し、他の人が簡単にビルドし、使用し、プロジェクトに貢献できるようにします。
私はこの記事で説明されている手順をテストしました。これはすべてのプラットフォームに対する解決策です。
なぜCMakeを使うのですか?
CMake はプロジェクトの Makefile を作成するビルドシステムジェネレータです。高度なレベルでは、プロジェクトの各部分、コンパイルオプション、依存関係、プロジェクトの構造をファイルレベルで定義することができます。CMakeが使用する情報は、特別な記述言語で書かれたCMakeLists.txtファイルで利用可能です。CMake がこのファイルを処理するとき、どのコンパイラがシステムにインストールされているかを自動的に検出し、それを起動するための Makefile ファイルを作成します。
サンプルプログラム
このサンプル・プログラムはシンプルなコマンドライン・ツールで、整数を引数にとり、1から与えられた入力値までの範囲でランダムに並べられた数値を出力します。
$ ./Producer 10
実行可能ファイルの main() 関数は、入力パラメータのみを処理し、値が与えられない場合はプ ログラムを終了します。
int main(int argc, char** argv){
if (argc != 2) {
std::cerr << "Enter the number of elements as argument" << std::endl;
return -1;
int range = 0;
range = std::stoi(argv[1]);
}catch (const std::invalid_argument&){
std::cerr << "Error: Cannot parse "" << argv[1] << "" ";
return -1;
catch (const std::out_of_range&) {
std::cerr << "Error: " << argv[1] << " is out of range";
return -1;
if (range <= 0) {
std::cerr << "Error: Zero or negative number provided: " << argv[1];
return -1;
std::stringstream data;
std::cout << Generator::generate(data, range).rdbuf();
実際の作業は ジェネレーターで 行われ、ジェネレーターはコンパイルされ、スタティック・ライブラリーとしてプロデューサーの実行ファイルにリンクされます。
std::stringstream &Generator::generate(std::stringstream &stream, const int range) {
std::vector<int> data(range);
std::iota(data.begin(), data.end(), 1);
std::random_device rd;
std::mt19937 g(rd());
std::shuffle(data.begin(), data.end(), g);
for (const auto n : data) {
stream << std::to_string(n) << " ";
return stream;
generate関数は std::stringstream 整数を引数にとります。整数範囲 n の値に基づいて、n までの範囲の整数のベクトルが作成され、スクランブルされます。スクランブルされたベクトルの次の値が文字列に変換され、stringstream にプッシュされます。この関数は、引数として渡されたのと同じ stringstream の参照を返します。
トップレベルの CMakeLists.txt
トップレベルの CMakeLists.txt は、プロジェクトのエントリーポイントです。サブディレクトリに複数の CMakeLists.txt ファイルがあるかもしれません。まずはトップレベルのCMakeLists.txtをステップバイステップでブラウズしてください。
最初の行は、ファイルを処理するのに必要なCMakeのバージョン、プロジェクト名とそのバージョン、そして意図するC++標準を示します。
cmake_minimum_required(VERSION 3.14)
project(CPP_Testing_Sample VERSION 1.0)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED True)
次の行を使用して、Generatorライブラリをビルドするために必要なすべての情報が含まれ、それ自身のCMakeLists.txtを含むサブディレクトリGeneratorを見るようにCMakeに指示します。これは、Generatorライブラリをビルドするために必要なすべての情報を含んでおり、独自のCMakeLists.txtを含んでいます。
add_subdirectory(Generator)
さて、今回取り上げるのは CMake モジュール です。モジュールのロードはCMakeの機能を拡張します。このプロジェクトでは、 FetchContent モジュールがロードされており、CMakeの実行中に外部リソース(この場合は GoogleTest )をダウンロードできるようになっています。
include(FetchContent)
FetchContent_Declare(
googletest
URL https://.////.ip
FetchContent_MakeAvailable(googletest)
次のセクションでは、ビルドするバイナリ、関連するソースファイル、リンクするライブラリ、コンパイラがヘッダファイルを見つけることができるディレクトリを指定します。
add_executable(Producer Producer.cpp)
target_link_libraries(Producer PUBLIC Generator)
target_include_directories(Producer PUBLIC "${PROJECT_BINARY_DIR}")
次のステートメントを使用すると、CMake はビルド・フォルダーに compile_commands.json 名前のファイルを作成します。このファイルは、プロジェクトの各ファイルのコンパイラオプションを表示します。VSCodiumでこのファイルをロードすると、IntelliSense関数にヘッダーファイルを探す場所を指示します。
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
enable_testing()
add_executable(unit_test unit_test.cpp)
target_link_libraries(unit_test gtest_main)
include(GoogleTest)
gtest_discover_tests(unit_test)
ライブラリレベルでのCMakeLists.txt
では、同じ名前のライブラリを含むサブディレクトリ Generator にある CMakeLists.txt ファイルを見てみましょう。このCMakeLists.txtファイルは少し短く、ユニットテスト関連のコマンドに加えて2つのステートメントしか含まれていません。
add_library(Generator STATIC Generator.cpp Generator.h)
target_include_directories(Generator INTERFACE ${CMAKE_CURRENT_SOURCE_DIR})
add_library(...) を使います。 を使用して、新しいビルドターゲットである静的 Generator ライブラリを定義します。ステートメント target_include_directories(...) を使用して、現在のサブディレクトリを他のビルドターゲットのヘッダーファイルの検索パスに追加します。また、この属性のスコープをINTERFACE型に指定します。これは、この属性が、ライブラリ自体ではなく、このライブラリにリンクされたビルドターゲットにのみ影響することを意味します。
VSCodiumを始める
CMakeLists.txtファイルの情報を使って、VSCodiumのようなIDEはそれに応じてビルドシステムを設定できます。VSCodiumやVS Codeの経験がない場合は、このサンプルプロジェクトが良い出発点になります。まず、両者の ウェブサイトに 行き、お使いのシステムの最新インストーラをダウンロードします。VSCodiumを開き、「」タブに移動します。
プロジェクトを適切にビルド、デバッグ、テストするには、以下の拡張機能を検索してインストールしてください:
まだ行っていない場合は、スタートページの " " をクリックしてリポジトリをクローンします。
または手動で入力してください:
git clone https://.//__.it
その後、以下のように入力してラベル devops_1チェックしてください:
git checkout tags/devops_1
または、「メイン」ブランチボタンをクリックし、ドロップダウンメニューからラベルを選択してください。
VSCodium内のリポジトリのルートフォルダを開くと、CMake Tools拡張機能がCMakeLists.txtファイルを検出し、直ちに適切なコンパイラを探すためにシステムをスキャンします。これで、画面下部の" "ボタンをクリックしてビルドプロセスを開始できます。また、現在アクティブなコンパイラを表示する下部エリアのボタンマーカーをクリックして、コンパイラを変更することもできます。
Producer 実行ファイルのデバッグを開始するには、デバッガシンボルをクリックし、 ドロップダウンメニューから " Producer " を選択します。
上述したように、Producer実行ファイルはコマンドライン引数として要素数を要求します。コマンドライン引数には .vscode/launch.json を指定できます。
これでプロジェクトのビルドとデバッグができるようになりました。
まとめ
CMakeのおかげで、上記の手順はどのオペレーティングシステムを実行していても動作するはずです。特にCMake関連の拡張機能を使うと、VSCodiumは強力なIDEになります。VSCodiumのGit統合には触れませんでしたが、すでにWeb上で多くのリソースを見つけることができるからです。適切なCMakeプロファイルを提供することで、他の人がビルドしたり、使用したり、プロジェクトに貢献したりしやすくなることがお分かりいただけると思います。次の投稿では、ユニットテストとCMakeのテストユーティリティctestを取り上げます。





