このページでは

CMake の入門

CMake は、アプリケーションのビルド、テスト、パッケージ化を可能にする一連のツール群です。Qtと同様、すべての主要な開発プラットフォームで利用可能です。また、 Qt Creator やVisual Studio Code など、さまざまな IDE でもサポートされています。

このセクションでは、CMakeプロジェクトでQtを使用する最も基本的な方法について説明します。まず、基本的なコンソールアプリケーションを作成します。次に、そのプロジェクトを拡張して、Qt GUIアプリケーションを作成します。 Qt Widgetsを使用するGUIアプリケーションへと拡張していきます。

既存の CMake プロジェクトを Qt を使用してビルドする方法については、コマンドラインで CMake を使用してプロジェクトをビルドする方法に関するドキュメントを参照してください。

CMake の基本を学ぶには、Qt Academy の「Building with CMake: Getting Started with CMake and Qt」コースを受講してください。

C++ コンソールアプリケーションのビルド

CMake プロジェクトは、CMake言語で記述されたファイルによって定義されます。メインファイルはCMakeLists.txt と呼ばれ、通常は実際のプログラムソースと同じディレクトリに配置されます。

以下は、Qt を使用して C++ で記述されたコンソールアプリケーションの典型的なCMakeLists.txt ファイルです:

cmake_minimum_required(VERSION 3.16)

project(helloworld VERSION 1.0.0 LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

find_package(Qt6 REQUIRED COMPONENTS Core)

qt_standard_project_setup()

qt_add_executable(helloworld
    main.cpp
)

target_link_libraries(helloworld PRIVATE Qt6::Core)

その内容を見ていきましょう。

cmake_minimum_required(VERSION 3.16)

cmake_minimum_required() プロジェクトのコンフィギュレーションを正常に行うために必要な、CMakeの最低バージョンを指定します。Qtで必要とされる最低バージョンについては、「サポートされているCMakeバージョン」を参照してください。

project(helloworld VERSION 1.0.0 LANGUAGES CXX)

project() プロジェクト名とデフォルトのプロジェクトバージョンを設定します。LANGUAGES 引数は、プログラムがC++で記述されていることをCMakeに伝えます。

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

Qt 6 では、C++ バージョン 17 以降をサポートするコンパイラが必要です。CMAKE_CXX_STANDARD およびCMAKE_CXX_STANDARD_REQUIRED 変数を設定してこの要件を強制すると、コンパイラが古すぎる場合に CMake がエラーを出力するようになります。

find_package(Qt6 REQUIRED COMPONENTS Core)

これにより、CMakeはQt 6を検索し、Core モジュールを利用可能にします。CMake がモジュールを見つけられない場合、処理を続行する意味がないため、この場合にCMakeが処理を中止するように、REQUIRED フラグを設定します。詳細については、「CMakeプロジェクトでQtを利用可能にする」を参照してください。

成功した場合、このモジュールは「モジュール変数」に記載されているいくつかの CMake 変数を設定します。さらに、以下で使用するQt6::Core ターゲットをインポートします。

qt_standard_project_setup()

qt_standard_project_setup()コマンドは、一般的な Qt アプリケーションに対して、プロジェクト全体のデフォルト設定を設定します。

とりわけ、このコマンドはCMAKE_AUTOMOC 変数をON に設定します。これにより、必要に応じてQtのMeta-Object Compiler (moc)が透過的に呼び出されるよう、CMakeにルールを自動的に設定するよう指示します。

詳細については、qt_standard_project_setup()のリファレンスを参照してください。

qt_add_executable(helloworld
    main.cpp
)

qt_add_executable() は、helloworld という名前の実行ファイル(ライブラリではない)をターゲットとしてビルドすることを CMake に指示します。 これは、組み込みの `add_executable() ` コマンドをラップしたもので、静的 Qt ビルドにおける Qt プラグインのリンクや、プラットフォーム固有のライブラリ名のカスタマイズなどを自動的に処理するための追加ロジックを提供します。

このターゲットは、C++ソースファイル `main.cpp` からビルドされる必要があります。

通常、ここではヘッダーファイルを指定しません。これはqmake とは異なり、qmake ではMeta-Object Compiler (moc) によって処理されるために、ヘッダーファイルを明示的に指定する必要があります。

ライブラリの作成については、qt_add_library() を参照してください。

target_link_libraries(helloworld PRIVATE Qt6::Core)

最後に、target_link_libraries は、helloworld 実行ファイルが Qt Core を使用していることを、上記のfind_package() 呼び出しによってインポートされたQt6::Core ターゲットを参照することで、CMakeに伝えます。これにより、リンカーに適切な引数が追加されるだけでなく、C++コンパイラに対して正しいインクルードディレクトリやコンパイラ定義が確実に渡されるようになります。PRIVATE キーワードは、実行可能ファイルターゲットにとって厳密には必須ではありませんが、指定しておくのが良い慣習です。もしhelloworld が実行可能ファイルではなくライブラリである場合は、PRIVATE またはPUBLIC のいずれかを指定する必要があります(ライブラリのヘッダーでQt6::Core に含まれるものを参照している場合はPUBLIC 、そうでない場合はPRIVATE )。

C++ GUI アプリケーションのビルド

前のセクションでは、単純なコンソールアプリケーション用の CMakeLists.txt ファイルを紹介しました。ここでは、 Qt Widgets モジュールを使用するGUIアプリケーションを作成します。

以下がプロジェクトファイルの全文です:

cmake_minimum_required(VERSION 3.16)

project(helloworld VERSION 1.0.0 LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

find_package(Qt6 REQUIRED COMPONENTS Widgets)

qt_standard_project_setup()

qt_add_executable(helloworld
    mainwindow.ui
    mainwindow.cpp
    main.cpp
)

target_link_libraries(helloworld PRIVATE Qt6::Widgets)

set_target_properties(helloworld PROPERTIES
    WIN32_EXECUTABLE ON
    MACOSX_BUNDLE ON
)

ここで行った変更点について順を追って見ていきましょう。

find_package(Qt6 REQUIRED COMPONENTS Widgets)

find_package の呼び出しにおいて、Core をWidgets に置き換えます。これにより、Qt6Widgets モジュールが特定され、後でリンクに使用するQt6::Widgets ターゲットが提供されます。

qt_standard_project_setup()

CMAKE_AUTOMOC に加え、qt_standard_project_setup()はCMAKE_AUTOUIC 変数をON に設定します。これにより、.ui のソースファイルに対してQtのUser Interface Compiler (uic)を呼び出すルールが自動的に作成されます。

qt_add_executable(helloworld
    mainwindow.ui
    mainwindow.cpp
    main.cpp
)

さらに、 Qt Widgets Designer ファイル(mainwindow.ui )とその対応する C++ ソースファイル(mainwindow.cpp )を、アプリケーションターゲットのソースに追加します。

注: .ui ファイルをプロジェクトに追加する別の 方法として、AUTOUIC の代わりにqt_add_ui()コマンドを使用する方法があります。

target_link_libraries(helloworld PRIVATE Qt6::Widgets)

target_link_libraries コマンドでは、Qt6::Core の代わりにQt6::Widgets に対してリンクを行います。なお、Qt6::Widgets はこのファイルに依存しているため、アプリケーションは引き続きQt6::Core に対してリンクを行うことに注意してください。

set_target_properties(helloworld PROPERTIES
    WIN32_EXECUTABLE ON
    MACOSX_BUNDLE ON
)

最後に、アプリケーションターゲットにプロパティを設定し、次のような効果をもたらします:

  • Windows でのコンソールウィンドウの生成を防止します。
  • macOS上でアプリケーションバンドルを作成します。

これらのターゲットプロパティに関する詳細については、CMakeのドキュメントを参照してください。

プロジェクトの構成

複数のターゲットを含むプロジェクトでは、プロジェクトファイルの構造を明確にすることで効率が向上します。ここでは、CMakeのサブディレクトリ機能を使用します。

今後、ターゲットを追加してプロジェクトを拡張する予定であるため、アプリケーションのソースファイルをサブディレクトリに移動し、その中に新しいCMakeLists.txt を作成します。

<project root>
├── CMakeLists.txt
└── src
    └── app
        ├── CMakeLists.txt
        ├── main.cpp
        ├── mainwindow.cpp
        ├── mainwindow.h
        └── mainwindow.ui

最上位のCMakeLists.txt には、プロジェクト全体の設定、find_package およびadd_subdirectory の呼び出しが含まれています:

cmake_minimum_required(VERSION 3.16)

project(helloworld VERSION 1.0.0 LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

find_package(Qt6 REQUIRED COMPONENTS Widgets)
qt_standard_project_setup()

add_subdirectory(src/app)

このファイルで設定された変数は、サブディレクトリ内のプロジェクトファイルからも参照可能です。

アプリケーションのプロジェクトファイル `src/app/CMakeLists.txt ` には、実行可能ターゲットが含まれています:

qt_add_executable(helloworld
    mainwindow.ui
    mainwindow.cpp
    main.cpp
)

target_link_libraries(helloworld PRIVATE Qt6::Widgets)

set_target_properties(helloworld PROPERTIES
    WIN32_EXECUTABLE ON
    MACOSX_BUNDLE ON
)

このような構造にしておけば、ライブラリやユニットテストなど、プロジェクトにターゲットを追加するのが容易になります。

注: システム上で動作するウイルス対策アプリケーションの「除外ディレクトリ」リストに、プロジェクトのビルドディレクトリを追加してください 。

ライブラリのビルド

プロジェクトが拡大するにつれて、アプリケーションコードの一部を、アプリケーションや場合によっては単体テストでも使用されるライブラリとして切り出したい場合があるでしょう。このセクションでは、そのようなライブラリを作成する方法について説明します。

現在のアプリケーションでは、ビジネスロジックがmain.cpp に直接記述されています。前のセクションで説明したように、このコードを"src/businesslogic" サブディレクトリ内のbusinesslogic という新しい静的ライブラリに抽出します。

簡略化のため、このライブラリは 1 つの C++ ソースファイルと、アプリケーションの `main.cpp` からインクルードされる対応するヘッダーファイルのみで構成されています:

<project root>
├── CMakeLists.txt
└── src
    ├── app
    │   ├── ...
    │   └── main.cpp
    └── businesslogic
        ├── CMakeLists.txt
        ├── businesslogic.cpp
        └── businesslogic.h

ライブラリのプロジェクトファイル(src/businesslogic/CMakeLists.txt )を見てみましょう。

qt_add_library(businesslogic STATIC
    businesslogic.cpp
)
target_link_libraries(businesslogic PRIVATE Qt6::Core)
target_include_directories(businesslogic INTERFACE ${CMAKE_CURRENT_SOURCE_DIR})

その内容を見ていきましょう。

qt_add_library(businesslogic STATIC
    businesslogic.cpp
)

`add_library` コマンドは、ライブラリ `businesslogic` を作成します。後で、アプリケーションがこのターゲットに対してリンクを行うようにします。

キーワード `STATIC ` は、静的ライブラリを表します。共有ライブラリや動的ライブラリを作成したい場合は、キーワード `SHARED ` を使用します。

target_link_libraries(businesslogic PRIVATE Qt6::Core)

ここでは静的ライブラリを作成しているため、実際には他のライブラリをリンクする必要はありません。しかし、このライブラリは `QtCore` のクラスを使用しているため、`Qt6::Core` へのリンク依存関係を追加します。これにより、必要な `QtCore ` のインクルードパスとプリプロセッサ定義が取り込まれます。

target_include_directories(businesslogic INTERFACE ${CMAKE_CURRENT_SOURCE_DIR})

ライブラリのAPIは、ヘッダーファイルbusinesslogic/businesslogic.h で定義されています。target_include_directories を呼び出すことで、businesslogic ディレクトリへの絶対パスが、当ライブラリを使用するすべてのターゲットのインクルードパスとして自動的に追加されるようにしています。

これにより、main.cpp 内でbusinesslogic.h を指定するために相対パスを使用する必要がなくなります。代わりに、次のように記述するだけで済みます。

#include <businesslogic.h>

最後に、ライブラリのサブディレクトリをプロジェクトファイルの最上位に追加する必要があります:

add_subdirectory(src/app)
add_subdirectory(src/businesslogic)

ライブラリの使用

前のセクションで作成したライブラリを使用するには、CMakeに対してそのライブラリをリンク対象として指定します:

target_link_libraries(helloworld PRIVATE
    businesslogic
    Qt6::Widgets
)

これにより、main.cppのコンパイル時にbusinesslogic.h が確実に検出されるようになります。さらに、businesslogic静的ライブラリはhelloworld 実行ファイルの一部となります。

CMakeの用語で言えば、ライブラリbusinesslogic は、このライブラリを利用するすべてのアプリケーションが満たさなければならない使用要件(インクルードパス)を指定しています。target_link_libraries コマンドがこれを処理してくれます。

リソースの追加

アプリケーション内でいくつかの画像を表示したいので、Qtリソースシステムを使用してそれらを追加します。

qt_add_resources(helloworld imageresources
    PREFIX "/images"
    FILES logo.png splashscreen.png
)

qt_add_resources()コマンドを実行すると、参照された画像を含む Qt リソースが自動的に作成されます。C++ ソースコードからは、指定されたリソースプレフィックスを先頭に付けることで、これらの画像にアクセスできます:

logoLabel->setPixmap(QPixmap(":/images/logo.png"));

qt_add_resources()コマンドは、最初の引数として変数名またはターゲット名のいずれかを指定します。上記の例に示すように、ターゲットベースの形式を使用することをお勧めします。

翻訳の追加

Qtプロジェクト内の文字列の翻訳は、.ts ファイルにエンコードされます。これらの.ts ファイルは、バイナリ形式の.qm ファイルにコンパイルされ、実行時にQtアプリケーションによって読み込まれます。詳細については、『Qtによる国際化』を参照してください。

このセクションでは、helloworld アプリケーションにドイツ語およびフランス語の翻訳を追加する方法について説明します。

qt_standard_project_setup() を使用して、両方の言語を指定します:

qt_standard_project_setup(I18N_TRANSLATED_LANGUAGES de fr)

次に、.qm ファイルをロードするターゲットに対してqt_add_translations()を呼び出します:

qt_add_translations(helloworld)

初回設定時、このコマンドにより、プロジェクトのソースディレクトリ内に `helloworld_de.ts ` および `helloworld_fr.ts ` ファイルが作成されます。これらのファイルには翻訳された文字列が含まれており、バージョン管理下に置くことが推奨されます。

また、このコマンドは、.ts ファイルから.qm ファイルを自動的に生成するためのビルドシステムルールも作成します。デフォルトでは、.qm ファイルはリソースに埋め込まれ、"/i18n" というリソースプレフィックスの下でアクセス可能になります。

.ts ファイルのエントリを更新するには、update_translations ターゲットをビルドします:

$ cmake --build . --target update_translations

.qm ファイルの生成を手動で実行するには、release_translations ターゲットをビルドします:

$ cmake --build . --target release_translations

.ts ファイルの処理やリソースへの埋め込み方法を調整する方法の詳細については、qt_add_translations のドキュメントを参照してください。

qt_add_translations()コマンドは、利便性を高めるためのラッパーです。.ts ファイルや.qm ファイルの処理をより細かく制御するには、基盤となるコマンドであるqt_add_lupdate()およびqt_add_lrelease() を使用してください。

関連情報

公式のCMake ドキュメントは、CMake を活用する上で非常に貴重な情報源です。

公式のCMakeチュートリアルでは、ビルドシステムに関する一般的なタスクについて解説しています。

書籍『Professional CMake: A Practical Guide』は、最も重要な CMake の機能について優れた入門書となっています。

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.