Pynote

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

Qt - ビルドシステムに CMake を利用する

試した環境

  • Ubuntu 16.04
  • Qt 5.9.1
  • CMake 3.5.1

手順

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

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

ファイルを用意する。

フォルダ構成

console/
├── CMakeLists.txt
└── src
└── main.cpp

main.cpp

#include <QCoreApplication>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    qDebug() << "Hello World";

    return a.exec();
}

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)

# QtWidgets ライブラリを検索する。
find_package(Qt5Core REQUIRED)

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

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

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

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

Qt に関連する CMake の書き方

set(CMAKE_INCLUDE_CURRENT_DIR ON)

ui ファイル等はビルド時にヘッダファイルに変換され、ビルドディレクトリに置かれる。
ビルドにはこれらの自動生成されたヘッダファイルをインクルードする必要があるため、ビルドディレクトリを include ディレクトリに追加するオプションを有効にする。

set(CMAKE_AUTOMOC ON)

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

find_package(Qt5Core REQUIRED)

Qt5 はいくつかのモジュールで構成されており、必要なモジュールを find_package() で探す。
All Modules | Qt 5.9

target_link_libraries(${PROJECT_NAME}
    Qt5::Core
)

ライブラリはこのような形で指定する。

Qt Designer によるビルド

Qt Designer は CMake をビルドシステムに使うこともできる。

1. メニューより「ファイル」 -> 「ファイル/プロジェクトを開く」を選択する。

f:id:nekobean:20171028160557p:plain

2. ファイルダイアログで CMakeLists.txt を選択する。
f:id:nekobean:20171028160655p:plain


3. 「Configure Project」 を選択する。

f:id:nekobean:20171028160809p:plain


4. ビルドすると、「Hello World」がコンソールに表示されました。

f:id:nekobean:20171028160859p:plain

コマンドラインによるビルド

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

$ 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/console/build

Qt5Core の cmake ファイルが $CMAKE_PREFIX_PATH 以下に存在しない場合、find_package(Qt5Core REQUIRED) に失敗する。
その場合、CMAKE_PREFIX_PATH 変数にインストールしたディレクトリを明示的に指定する必要がある。

$ cmake -DCMAKE_PREFIX_PATH=/opt/Qt5.9.1/5.9.1/gcc_64 ..

3. make する。

$ make
Scanning dependencies of target sample_automoc
[ 25%] Automatic moc for target sample
[ 25%] Built target sample_automoc
Scanning dependencies of target sample
[ 50%] Building CXX object CMakeFiles/sample.dir/src/main.cpp.o
[ 75%] Building CXX object CMakeFiles/sample.dir/sample_automoc.cpp.o
[100%] Linking CXX executable sample
[100%] Built target sample

4. 実行する。

$ ./sample
Hello World