CMakeLists.txtの基本構文を理解しよう|最重要コマンドたちの使い方

◎ 本記事は「CMake講座」シリーズの第2回です。
前回 -> 【第1回】CMakeの基本と最小構成を理解しよう!〜C++ビルドの第一歩〜
次回 ->【第3回】CMakeで複数ディレクトリ構成を作ろう!〜モジュール分割の基本〜

○ シリーズ全体の構成はこちら: CMake講座トップページ

【第2回】CMakeLists.txtの基本を理解しよう 〜主要コマンドと構成の基礎〜

前回は、CMakeを使って最小構成のC++プロジェクトをビルドする手順を学びました。
今回は、その中心となる設定ファイル CMakeLists.txt の中身を、ひとつずつ整理して理解していきます。


1. CMakeLists.txtとは

CMakeLists.txt は、CMakeが参照する「ビルド設定ファイル」です。
どのソースをビルドし、どのライブラリを使い、どのC++バージョンを利用するかといった情報を記述します。

CMakeLists.txt → (CMake) → Makefile → (make) → 実行ファイル

CMakeLists.txt が正しく書かれていれば、CMakeはその内容を解析し、環境に合ったMakefileを自動生成します。


2. 最小構成のCMakeLists.txt

cmake_minimum_required(VERSION 3.10)
project(MyApp LANGUAGES CXX)

add_executable(MyApp main.cpp)

この3行で、C++プログラムのビルド設定が完結します。
それぞれの命令が何をしているのかを順に見ていきましょう。


2-1. cmake_minimum_required — バージョン指定

cmake_minimum_required(VERSION 3.10)

この命令は、プロジェクトで必要なCMakeの最低バージョンを指定します。
例では「CMake 3.10以上」が必須という意味です。

指定しない場合、古いCMakeで非互換の挙動が起こる可能性があります。
プロジェクトを配布する場合には、環境の再現性を保つためにも必ず書くようにしましょう。


2-2. project — プロジェクト定義

project(MyApp VERSION 1.0 LANGUAGES CXX)

project() は、プロジェクトの名前・使用言語・バージョンなどを宣言します。

引数意味
MyAppプロジェクト名
VERSION 1.0任意のバージョン番号
LANGUAGES CXXC++を使用

CMakeではこれらの情報をもとに変数(PROJECT_NAME, PROJECT_VERSION など)が自動的に設定されます。


2-3. add_executable — 実行ファイルを作成する

add_executable(MyApp main.cpp app.cpp)
引数内容
第1引数出力する実行ファイル名
第2引数以降ソースファイルのリスト

複数のソースを指定することで、プロジェクト全体をまとめてビルドできます。


2-4. set(CMAKE_CXX_STANDARD) — C++標準バージョンの設定

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
変数名意味
CMAKE_CXX_STANDARD使用するC++のバージョンを指定
CMAKE_CXX_STANDARD_REQUIRED指定したバージョンを必須にする
CMAKE_CXX_EXTENSIONSgnu拡張(-std=gnu++17)を無効化

これにより、-std=c++17 オプションでコンパイルされるようになります。

3. 最重要オプション

3-1. target_include_directories — ヘッダファイルのパスを追加する

target_include_directories(MyApp PRIVATE include)
修飾子意味
PRIVATEこのターゲットのみにリンクする
PUBLIC他のターゲットにもリンクを引き継ぐ
INTERFACE自分には不要で、リンク相手だけに適用

例として、include/ 配下にある utils.hpp を使いたい場合、上記のように書いておくと #include "utils.hpp" が有効になります。
#include "include/utils.hpp" とする必要がなくなります。)


3-2. target_link_libraries — 外部ライブラリをリンクする

target_link_libraries(MyApp PRIVATE m)

ここでは、数学ライブラリ libm-lm)をリンクしています。

修飾子には target_include_directories と同様に PRIVATE / PUBLIC / INTERFACE が存在し、
それぞれ target_include_directories と同様の意味を持ちます。


3-3. add_library — 自作ライブラリを定義する

add_library(MyLib STATIC src/lib.cpp)
target_include_directories(MyLib PUBLIC include)

add_executable(MyApp src/main.cpp)
target_link_libraries(MyApp PRIVATE MyLib)
修飾子意味
STATIC静的ライブラリ (.a) を作成する
SHARED動的ライブラリ (.so) を作成する

このようにすると、MyLib を再利用可能な部品として扱うことができます。

特に、しっかりと構造化されたプロジェクトのビルドでは、それぞれの階層で静的なライブラリを作成し、
トップの main.cpp にリンクして最終的なバイナリとすることも多いため非常に重要です。


4. 実際に動かしてみよう

MyApp/
├── CMakeLists.txt
├── src/
│   ├── main.cpp
│   └── util.cpp
└── include/
    └── util.hpp

CMakeLists.txt:

cmake_minimum_required(VERSION 3.10)
project(MyApp LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

add_executable(MyApp src/main.cpp src/util.cpp)
target_include_directories(MyApp PRIVATE include)

ビルド手順:

cmake -S ./ -B ./build
cmake --build ./build
./build/MyApp

実行結果:

Hello, CMake!

これで、単一ファイルから複数ソースを含むプロジェクトまで発展できました。


5. まとめ

機能コマンド役割
バージョン指定cmake_minimum_required()安全な実行環境を保証
プロジェクト設定project()名前・バージョン・言語を定義
C++設定set(CMAKE_CXX_STANDARD ...)C++標準を統一
実行ファイルadd_executable()出力ファイルを定義
ヘッダ検索パスtarget_include_directories()includeフォルダを設定
外部リンクtarget_link_libraries()ライブラリをリンク
自作ライブラリadd_library()再利用可能なモジュール化

◎ CMakeLists.txt の構成を理解すると、ビルドの流れが明確になります。
今後はより複雑なプロジェクト構成にも対応できるようになります。


6. 次回予告

次回は「複数ディレクトリ構成のCMakeプロジェクト」を扱います。
add_subdirectory() を使って、ライブラリとアプリケーションを分離する方法を学びます。


◇CMake基礎講座

←(第1回:CMakeの基本と最小構成を理解しよう)
(第3回:CMakeで複数ディレクトリ構成を作る方法)

CMake講座トップページに戻る