Pynote

Python、機械学習、画像処理について

Qt - ビルドシステムに CMake を利用する (UI/リソース定義ファイルを含むプロジェクト)

概要

Qt の UI/リソース定義ファイルを含むプロジェクトを CMake でビルドする方法について紹介する。
基本編は過去の記事を参照してほしい。
pynote.hatenablog.com

試した環境

  • CMake 3.5.1

手順

サンプルコード全体はこちら

qt_examples/cmake_example/widget at master · nobetan/qt_examples · GitHub

ファイルを用意する。

フォルダ構成

widget/
├── CMakeLists.txt
├── res
│   ├── qt.png
│   └── resources.qrc
└── src
├── main.cpp
├── mainwindow.cpp
├── mainwindow.h
└── mainwindow.ui

CMakeLists.txt

# CMake の最低限必要なバージョンは設定する。
# Qt では 2.8.3 以上が必須、3.1.0 以上が推奨である。
cmake_minimum_required(VERSION 2.8.3)

# プロジェクト名を設定する。
project(sample)

# ビルドディレクトリを include ディレクトリに追加するオプションを有効にする。
set(CMAKE_INCLUDE_CURRENT_DIR ON)

# MOC が必要な場合は自動的に実行するオプションを有効にする。
set(CMAKE_AUTOMOC ON)

# UI 定義ファイルの変換が必要な場合は自動的に実行するオプションを有効にする。
set(CMAKE_AUTOUIC ON)

# リソース定義ファイルの変換が必要な場合は自動的に実行するオプションを有効にする。
set(CMAKE_AUTORCC ON)

# QtWidgets ライブラリを追加する。
find_package(Qt5Widgets REQUIRED)

# src ディレクトリにあるビルド対象のファイルをリストアップする。
file(GLOB_RECURSE CPP_FILES src/*.cpp)
file(GLOB_RECURSE UI_FILES src/*.ui)
file(GLOB_RECURSE QRC_FILES res/*.qrc)

# src ディレクトリを include ディレクトリに追加する。
include_directories(src)

# 生成する実行ファイルを追加する
add_executable(${PROJECT_NAME}
    ${CPP_FILES}
    ${UI_FILES}
    ${QRC_FILES}
)

# 依存ライブラリをリンクする
target_link_libraries(${PROJECT_NAME}
    Qt5::Widgets
)

Qt に関連する CMake の書き方

set(CMAKE_AUTOUIC ON)

UI 定義ファイルの変換が必要な場合は自動的に実行するオプションを有効にする。

set(CMAKE_AUTORCC ON)

リソース定義ファイルの変換が必要な場合は自動的に実行するオプションを有効にする。

file(GLOB_RECURSE CPP_FILES src/*.cpp)
file(GLOB_RECURSE UI_FILES src/*.ui)
file(GLOB_RECURSE QRC_FILES res/*.qrc)

add_executable(${PROJECT_NAME}
    ${CPP_FILES}
    ${UI_FILES}
    ${QRC_FILES}
)

UI 定義ファイル (*.ui)、リソース定義ファイル (*.qrc) を add_executable() に追加する。
CMAKE_AUTOUIC、CMAKE_AUTORCC オプションを有効にしていると、これらのファイルを基に自動的に必要なコードが生成される。

ビルド

Qt Designer、コマンドラインどちらでもビルドできる。詳しくは別記事を参照してほしい。
ここでは、コマンドラインによるビルドのみ紹介する。

1. 「widgetディレクトリにビルド用のディレクトリを作成する。

$ mkdir build
$ cd build

2. CMake を実行する。

$ cmake ..
-- The C compiler identification is GNU 5.4.0
-- The CXX compiler identification is GNU 5.4.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /root/widget/build

3. make する。

$ make
Scanning dependencies of target sample_automoc
[ 16%] Automatic moc, uic and rcc for target sample
Generating ui_mainwindow.h
Generating moc_mainwindow.cpp
[ 16%] Built target sample_automoc
Scanning dependencies of target sample
[ 33%] Building CXX object CMakeFiles/sample.dir/src/mainwindow.cpp.o
[ 50%] Building CXX object CMakeFiles/sample.dir/src/main.cpp.o
[ 66%] Building CXX object CMakeFiles/sample.dir/sample_automoc.cpp.o
[ 83%] Building CXX object CMakeFiles/sample.dir/CMakeFiles/sample.dir/qrc_resources.cpp.o
[100%] Linking CXX executable sample
[100%] Built target sample

4. 実行する。

$ ./sample

f:id:nekobean:20171028175854p:plain