Taro3

View on GitHub

.proファイルの深層

ビルドボタンをクリックすると、Qt Creatorは何をしているのでしょうか?Qtは、単一の.proファイルで異なるプラットフォームのコンパイルをどのように扱うのでしょうか?Q_OBJECT マクロは正確には何を意味しているのでしょうか?次のセクションでは、これらの質問をそれぞれ掘り下げていきます。先ほど完成させた SysInfo アプリケーションを例に、Qt がその下で何をしているのかを勉強していきます。

この調査は.proファイルを掘り下げることから始めることができます。.pro ファイルは、Qt プロジェクトをコンパイルする際の主要なエントリーポイントです。基本的に、.pro ファイルはプロジェクトで使用されるソースとヘッダを記述した qmake プロジェクトファイルです。これはプラットフォームに依存しないMakefileの定義です。まず、ch02-sysinfoアプリケーションで使用されている異なるqmakeキーワードについて説明します。

QT       += core gui charts

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

CONFIG += C++14

# You can make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

これらの関数にはそれぞれ特定の役割があります。

ch02-sysinfoアプリケーションでは、直感的なスコープの仕組みを利用したプラットフォーム固有のコンパイルルールの利用を開始しました。

windows {
    SOURCES += sysinfowindowsimpl.cpp
    HEADERS += sysinfowindowsimpl.h
}

これをMakefileでやらなければならないとしたら、まともにやる前に毛が抜けてしまうかもしれません(ハゲていることは言い訳になりません)。この構文はシンプルでありながら強力なもので、条件文にも使われます。例えば、デバッグのみでいくつかのファイルをビルドしたいとしましょう。あなたは以下のように書いたでしょう。

windows {
    SOURCES += SysInfoWindowsImpl.cpp
    HEADERS += SysInfoWindowsImpl.h
    debug {
        SOURCES += DebugClass.cpp
        HEADERS += DebugClass.h
    }
}

debug スコープを windows 内にネストすることは、if (windows && debug) と同等です。スコーピングの仕組みはさらに柔軟です。この構文では、OR ブール演算子条件を持つことができます。

windows:unix {
    SOURCES += SysInfoWindowsAndLinux.cpp
}

他のif/else文を持っていても構いません。

windows:unix {
    SOURCES += SysInfoWindowsAndLinux.cpp
} else:macx {
    SOURCES += SysInfoMacImpl.cpp
} else {
    SOURCES += UltimateGenericSources.cpp
}

このコードスニペットでは、+= 演算子を使用しています。qmake ツールには、変数の動作を変更するための幅広い演算子が用意されています。

.proファイルで変数を定義し、異なる場所で再利用することもできます。qmake message() 関数を使用することで、これを簡単にすることができます。

COMPILE_MSG = "Compiling on"
windows {
    SOURCES += SysInfoWindowsImpl.cpp
    HEADERS += SysInfoWindowsImpl.h
    message($$COMPILE_MSG windows)
}
linux {
    SOURCES += SysInfoLinuxImpl.cpp
    HEADERS += SysInfoLinuxImpl.h
    message($$COMPILE_MSG linux)
}
macx {
    SOURCES += SysInfoMacImpl.cpp
    HEADERS += SysInfoMacImpl.h
    message($$COMPILE_MSG mac)
}

プロジェクトをビルドすると、プロジェクトをビルドするたびにプラットフォーム固有のメッセージが 「一般メッセージ」 タブに表示されます (このタブは、ウィンドウ → 出力ペイン → 一般メッセージ からアクセスできます)。ここでは、COMPILE_MSG 変数を定義し、 message($$COMPILE_MSG windows) を呼び出す際にこれを参照しています。これは、.proファイルから外部ライブラリをコンパイルする必要がある場合に興味深い可能性を提供します。変数内のすべてのソースを集約したり、特定のコンパイラへの呼び出しと組み合わせたりすることができます。

Tip

スコープ固有の文が1行の場合は、以下の構文で記述できます。

windows:message($$COMPILE_MSG windows)

message() の他にも、いくつかの便利な関数があります。

すべての機能は http://doc.qt.io/qt-5/qmake-test-function-reference.html に記載されています。


戻る