Qtの設定 - qmake
概要
qmakeとは
qmakeは、異なるプラットフォーム間での開発プロジェクトのビルドプロセスを簡略化して、ソフトウェア、ライブラリ、その他コンポーネントのビルドプロセスを管理する。
各Qtプロジェクトファイルの情報を元にMakefileの生成を自動化して、各Makefileを作成するために必要な情報を簡便にすることができる。
また、Qtで記述されているかどうかに関わらず、あらゆるソフトウェアプロジェクトに使用することができる。
また、qmakeには、Qtライブラリを使用した開発を支援するための機能があり、mocやuicのビルドルールも含まれる。
開発者がQtプロジェクトファイルを変更することなく、Visual Studio向けのプロジェクトを生成することも可能である。
Qtプロジェクトの記述
qmakeは、Qtプロジェクトファイル内の情報を使用して、各Qtプロジェクトをビルドするために必要な全てのコマンドを含むMakefileを生成する。
Qtプロジェクトファイルには、ソースファイル、ヘッダファイル、設定情報、ソフトウェア固有の詳細情報(リンクするライブラリの追加リストや使用するインクルードパスの追加リスト)が含まれる。
Qtプロジェクトファイルには、コメント、変数宣言、組み込み関数、簡単な制御構造等、様々な要素を含めることができる。
実行ファイルプロジェクトまたはライブラリプロジェクトのテンプレートを使用して、ビルドプロセスを調整するための設定オプションを指定することもできる。
詳細を知りたい場合は、「プロジェクトタイプのビルド」を参照すること。
また、qmakeを使用してQtプロジェクトファイルを生成することもできる。
qmakeのコマンドラインオプションの詳細を知りたい場合は、「qmakeの実行」を参照すること。
qmakeの設定で、多くのクロスプラットフォームプロジェクトを扱うことができる。
ただし、プラットフォーム固有の変数を使用することが必要な場合がある。
詳細を知りたい場合は、「プラットフォーム」を参照すること。
Qtプロジェクトのビルド
多くのプロジェクトでは、Qtプロジェクトのトップレベルディレクトリにおいて、qmakeコマンドを実行するだけでよい。
その後、makeコマンドを実行することにより、Makefileに従ってプロジェクトをビルドすることができる。
qmakeがビルドプロセスを設定する時に使用する環境変数の詳細については、「qmakeの設定」を参照すること。
サードパーティ製ライブラリの使用
サードパーティ製ライブラリの詳細は、「サードパーティ製ライブラリを使用する」を参照すること。
ヘッダファイルのプリコンパイル
大規模なプロジェクトでは、プリコンパイルされたヘッダファイルを使用することにより、ビルドプロセスを高速化することが可能である。
詳細を知りたい場合は、「プリコンパイルされたヘッダファイルの使用」を参照すること。
Qtプロジェクトファイルの基本的な変数
CONFIG
変数CONFIGは、Qtプロジェクトの設定とコンパイラのオプションを指定する。
変数CONFIGの値は、qmakeが内部で認識して、特別な意味を持つ。
下表に、コンパイラとリンカのフラグを制御する変数CONFIGで使用できる値を示す。
| 変数CONFIGに指定できるオプション | 説明 |
|---|---|
| release | Qtプロジェクトをリリースモードでビルドする。debugも指定した場合は、最後に指定されたものが有効になる。
|
| debug | Qtプロジェクトをデバッグモードでビルドする。 |
| debug_and_release | デバッグモードとリリースモードの両方でビルドする。 |
| debug_and_release_target | この値はデフォルトで設定されている。 もし、 debug_and_releaseも同時に指定している場合、デバッグとリリースのビルドは別々のdebugとreleaseディレクトリに出力される。
|
| build_all | debug_and_releaseも同時に指定している場合、デフォルトでデバッグとリリースの両方のモードでビルドされる。
|
| autogen_precompile_source | Qtプロジェクトファイルで指定したプリコンパイルされたヘッダファイルを含む.cppファイルを自動的に生成する。 |
| ordered | 変数SUBDIRSを使用する場合、orderedオプションはリストされたディレクトリが与えられた順番で処理するように指定する。※注意 orderedオプションの使用は非推奨である。代わりに、変数 SUBDIRSを使用して、依存関係を指定する。
|
| precompile_header | プリコンパイルされたヘッダファイルを使用する。 |
| precompile_header_c (Visual C++のみのオプション) |
C言語のプリコンパイルされたヘッダファイルを使用する。 |
| warn_on | コンパイラはできるだけ多くの警告を出力する。warn_offオプションも同時に指定した場合は、最後に指定したものが有効になる。
|
| warn_off | コンパイラは警告をできるだけ出力しない。 |
| exceptions | デフォルトで有効に設定されている。 例外サポートが有効になる。 |
| exceptions_off | 例外サポートを無効にする。 |
| ltcg | デフォルトで無効に設定されている。 リンクタイムコード生成を有効にする。 |
| rtti | 未指定の場合は、コンパイラのデフォルトが使用される。 RTTIサポートを有効にする。 |
| rtti_off | 未指定の場合は、コンパイラのデフォルトが使用される。 RTTIサポートを無効にする。 |
| stl | 未指定の場合は、コンパイラのデフォルトが使用される。 STLサポートを有効にする。 |
| stl_off | 未指定の場合は、コンパイラのデフォルトが使用される。 STLサポートを無効にする。 |
| thread | スレッドサポートを有効にする。 変数 CONFIGにqtが含まれている場合は、デフォルトで有効に設定されている。
|
| no_utf8_source | QtプロジェクトのソースファイルにUTF-8エンコーディングを使用せずに、コンパイラのデフォルトの設定を使用する。 |
| hide_symbols | 未指定の場合は、コンパイラのデフォルトが使用される。 バイナリ内のシンボルのデフォルトの可視性を非表示に設定する。 |
| depend_includepath | デフォルトで有効に設定されている。 変数 INCLUDEPATHの値を変数DEPENDPATHに付加することを有効にする。
|
| lrelease | 変数TRANSLATIONSと変数EXTRA_TRANSLATIONSにリストされている全てのファイルに対して、lreleaseコマンド(翻訳)を実行する。変数 QMAKE_LRELEASE_FLAGSにlreleaseコマンドのオプションを記述する。embed_translationsオプションが未指定の場合、生成されたQMファイルを変数QM_FILES_INSTALL_PATHにインストールする。
|
| embed_translations | 変数QM_FILES_RESOURCE_PREFIXで指定したディレクトリに、lreleaseコマンドの実行により生成された翻訳ファイルを実行ファイルに埋め込む。lreleaseオプションも設定する必要がある。
|
TARGET
ターゲットファイルの名前を指定する。
未指定の場合は、Qtプロジェクトファイルのベースネームが使用される。
# 以下の例では、UnixではMySoftware、WindowsではMySoftware.exeという名前の実行ファイルを生成する TARGET = MySoftware
SOURCES
変数SOURCESは、Qtプロジェクトに含まれる全てのソースコードファイルの名前を指定する。
例.
SOURCES += main.cpp \
mainwindow.cpp
HEADERS
変数HEADERSは、Qtプロジェクトのヘッダファイルの名前を指定する。
qmakeは、ヘッダファイルに定義しているクラスがmocを必要とするかどうかを自動的に検出した後、
mocが必要な場合はmocファイルを生成して、リンクするために適切な依存関係とファイルをQtプロジェクトに追加する。
HEADERS += main.h \
mainwindow.h
SUBDIRS
subdirsテンプレートと同時に使用する場合、ビルドする必要のあるQtプロジェクトの一部を含む全てのサブディレクトリまたはQtプロジェクトファイルの名前を指定する。
この変数で指定した各サブディレクトリは、それ自身のQtプロジェクトファイルを含んでいる必要がある。
各サブディレクトリ内のQtプロジェクトファイルは、サブディレクトリ自身と同じベースネームを持つ場合、ファイル名を省略することができる。
(例えば、サブディレクトリがMySoftwareという名前の場合、そのディレクトリのQtプロジェクトファイルはMySoftware.proという名前の場合)
また、任意のディレクトリにあるQtプロジェクトファイルへの相対パスを指定することもできる。
ただし、現在のプロジェクトの親ディレクトリとそのサブディレクトリにあるパスだけを指定することを推奨する。
依存関係が無い場合では、全てのビルドは変数SUBDIRSに記述した順番(上から順次)に行われる。
SUBDIRS = MyTool \
MySoftware
各サブディレクトリを特定の順序で構築する必要がある場合、関連する変数SUBDIRSの要素に.depends修飾子を使用する。
以下の例では、MyLibraryがMySoftwareの前にビルドされて、MySoftwareがMyTestの前にビルドされることを保証している。
MyDocumentは、他のサブディレクトリと並行してビルドすることができるため、ビルドプロセスを高速化することができる。
SUBDIRS += MySoftware \
MyLibrary \
MyTest \
MyDocument
MySoftware.depends = MyLibrary
MyTest.depends = MySoftware
複数の依存関係を指定することもでき、それらは全て依存するターゲットの前にビルドされる。
※注意
変数CONFIGにorderedオプションを使用することは非推奨である。
これは、マルチコアのビルドを遅くする可能性がある。
コンパイラの設定
GCCやG++コンパイラ等を標準以外に変更する場合、プロジェクトファイル(.pro拡張子)に以下の設定を追記する。
- QMAKE_CC
- C言語のソースコードを含むプロジェクトをビルドする時に使用されるC言語のコンパイラを指定する。
QMAKE_CC = /<GCCのインストールディレクトリ>/bin/gcc-10.2- また、環境変数PATHにGCCやG++等のパスを設定している場合、以下のように、コンパイラのファイル名だけで指定することができる。
QMAKE_CC = gcc-10.2QMAKE_CCオプションは、CONFIGオプションよりも上に記述する。
- QMAKE_CXX
- C++言語のソースコードを含むプロジェクトをビルドする時に使用されるC++言語のコンパイラを指定する。
QMAKE_CXX = /<GCCのインストールディレクトリ>/bin/g++-10.2- また、環境変数PATHにGCCやG++等のパスを設定している場合、コンパイラのファイル名だけで指定することができる。
QMAKE_CXX = g++-10.2QMAKE_CXXオプションは、CONFIGオプションよりも上に記述する。
- QMAKE_CFLAGS
- プロジェクトをビルドするためのC言語のコンパイラフラグを指定する。
- この変数の値は、qmakeまたはqmake.confによって処理され、変更する必要はほとんど無い。
- デバッグモードとリリースモードの固有のフラグは、それぞれ変数QMAKE_CFLAGS_DEBUGと変数QMAKE_CFLAGS_RELEASEを変更することで調整できる。
- 例えば、C11、C17、C20の規格を使用する場合は、
QMAKE_CFLAGS += -std=c11やQMAKE_CFLAGS += -std=c17と記述する。
- QMAKE_CFLAGS_DEBUG
- デバッグビルドのC言語のコンパイラフラグを指定する。
- この変数の値は、qmakeまたはqmake.confによって処理され、変更する必要はほとんど無い。
- QMAKE_CFLAGS_RELEASE
- リリースビルドのC言語のコンパイラフラグを指定する。
- この変数の値は、qmakeまたはqmake.confによって処理され、変更する必要はほとんど無い。
- QMAKE_CXXFLAGS
- プロジェクトをビルドするためのC++のコンパイラフラグを指定する。
- この変数の値は、qmakeまたはqmake.confによって処理され、変更する必要はほとんど無い。
- デバッグモードとリリースモードの固有のフラグは、それぞれ変数QMAKE_CXXFLAGS_DEBUGと変数QMAKE_CXXFLAGS_RELEASEを変更することで調整できる。
- 例えば、C++14、C++17、C++20の規格を使用する場合は、
QMAKE_CXXFLAGS += -std=c++14やQMAKE_CXXFLAGS += -std=c++17と記述する。
- QMAKE_CXXFLAGS_DEBUG
- デバッグビルドのC++のコンパイラフラグを指定する。
- この変数の値は、qmakeまたはqmake.confによって処理され、変更する必要はほとんど無い。
- QMAKE_CXXFLAGS_RELEASE
- リリースビルドのC++のコンパイラフラグを指定する。
- この変数の値は、qmakeまたはqmake.confによって処理され、変更する必要はほとんど無い。
- QMAKE_LINK
- アプリケーションベースのプロジェクトを構築する時に使用するリンカを指定する。
- 環境変数PATHに含まれるパス上にある場合、リンカファイルのファイル名のみを指定することができる。
- この変数の値は、qmakeまたはqmake.confによって処理され、変更する必要はほとんど無い。
インクルードの設定
- INCLUDEPATH
- プロジェクトに必要な追加のインクルードディレクトリのリストである。
- プロジェクトのコンパイル時に検索するインクルードディレクトリ(
#include <ヘッダファイル>)を指定する。 - 例 :
INCLUDEPATH += /home/user/include- スペースを含むパスを指定するには、以下のように記述する。
- UNIX系OSの場合
INCLUDEPATH += "/home/user/extra headers" - Windowsの場合
INCLUDEPATH += "C:/myincludes/extra headers"
- DEPENDPATH
- ソフトウェアまたはライブラリの依存関係を解決するため、
qmakeコマンドがスキャンするインクルードディレクトリパスのリストを指定する。 - DEPENDPATHは、ソースコードに
#includeで指定したヘッダファイルにおいて、qmakeコマンドがクロールする時に使用される。 - 特に、
Q_OBJECTからのmocファイルの依存関係を解決するために、DEPENDPATHが必要となる。
- ソフトウェアまたはライブラリの依存関係を解決するため、
- QMAKE_INCDIR
- INCLUDEPATHに追加されるシステムヘッダのパスのリストを指定する。
- この変数の値は、qmakeまたはqmake.confによって処理され、変更する必要はほとんど無い。
ライブラリの設定
- LIBS
- プロジェクトにリンクするライブラリのリストを指定する。
- UNIX系OSにおいて、
-l(ライブラリ)フラグと-L(ライブラリパス)フラグを使用する場合、 - qmakeはWindowsでライブラリを正しく処理する。(ライブラリのフルパスをリンカに渡す)
-lで指定されているディレクトリを見つけるには、ライブラリが存在している必要があります。- 例 :
- UNIX系OSの場合
LIBS += -L/usr/local/lib -lmath - Windowsの場合
LIBS += c:/mylibs/math.lib - また、スペースを含むパスを指定するには、以下のように記述する。
- UNIX系OSの場合
LIBS += "-L/usr/local lib/lib" -lmath - Windowsの場合
LIBS += "C:/mylibs lib/math.lib" - 標準では、LIBSに格納されているライブラリのリストは、使用される前に一意の名前のリストに縮小される。
- この動作を変更するには、変数CONFIGに
no_lflags_mergeオプションを追加する。 CONFIG += no_lflags_merge
- LIBS_PRIVATE
- プロジェクトにプライベートリンクするライブラリのリストを指定する。
- この変数の動作はLIBSと同じであるが、UNIX用の共有ライブラリプロジェクトがリンクインターフェイスで、これらの依存関係を公開しない点が異なる。
- 例えば、あるプロジェクトがライブラリA(ライブラリAは、ライブラリBにプライベートに依存)に依存している場合、
- プロジェクトからもライブラリBを直接使用する場合、ライブラリBに明示的にリンクする必要があるということである。
- 言い換えると、プライベートにリンクされたライブラリは、ビルド時に推移的に公開されない。
- QMAKE_LIBDIR
- 全てのプロジェクトのライブラリ検索パスのリストを指定する。
- この変数の値は、qmakeまたはqmake.confによって処理され、変更する必要はほとんど無い。
- プロジェクトファイルで追加のライブラリ検索パスを指定するには、LIBSを使用する。
LIBS += -L/path/to/libraries
- QMAKE_LIBDIR_POST
- 全てのプロジェクトのシステムライブラリ検索パスのリストを指定する。
- この変数の値は、qmakeまたはqmake.confによって処理され、変更する必要はほとんど無い。
- QMAKE_LIBDIR_FLAGS
- この変数は、UNIX系OSでのみ使用される。
- 接頭辞
-Lが付いた全てのライブラリディレクトリの場所を指定する。 - この変数の値は、qmakeまたはqmake.confによって処理され、変更する必要はほとんど無い。
- QMAKE_LIBS
- 各プロジェクトがリンクする必要のある追加のライブラリを指定する。
- この変数の値は、qmakeまたはqmake.confによって処理され、変更する必要はほとんど無い。
- プロジェクトファイルでライブラリを指定するには、LIBSを使用する。
- QMAKE_LIBS_PRIVATE
- 各プロジェクトがリンクする必要のある追加のプライベートライブラリを指定する。
- この変数の値は、qmakeまたはqmake.confによって処理され、変更する必要はほとんど無い。
- プロジェクトファイルでプライベートライブラリを指定するには、LIBS_PRIVATEを使用する。
インストールの設定
- INSTALLS
- make installコマンドまたは同様のインストール手順が実行される場合、インストールされるリソースのリストを指定する。
- リスト内の各項目は、インストールされる場所に関する情報を提供する属性を指定する。
- この変数は、組み込みデバイスに展開される追加ファイルを指定するためにも使用される。
- 例えば、変数target.pathは、ビルドターゲットがインストールされる場所を示し、
- 変数INSTALLSは、インストールされる既存のリソースのリストにビルドターゲットを追加する。
target.path += $$[QT_INSTALL_PLUGINS]/imageformatsINSTALLS += target- 下表に、変数INSTALLSにおけるいくつかの値を記載する。
| 値 | 説明 |
|---|---|
| no_check_exist | この値が設定されていない場合、qmakeはインストールするファイルが実際に存在するかどうかを確認する。 これらのファイルが存在しない場合、qmakeはインストールルールを作成しない。 qdocによって作成されたHTMLファイル等、ビルドプロセスの一部として生成されたファイルをインストールする必要がある場合は、 この値を使用する。 |
| nostrip | この値が設定されている場合、UNIXのストリップ機能はオフになり、デバッグ情報はバイナリに残る。 |
| executable | この値が設定されている場合、UNIX系OSでは、実行可能フラグが設定される。 |
| no_build | make installコマンドを実行した時、まだプロジェクトのビルドが無い場合、プロジェクトをビルドされた後にインストールされる。 この動作を望まない場合は、この値を設定して、ビルドターゲットがインストールターゲットへの依存関係として追加されないようにする。 |
| no_default_install | プロジェクトにトップレベルのプロジェクトターゲットが存在する場合、make installコマンドを実行すると、全てがインストールされる。 ただし、この値が設定されたインストールターゲットがある場合、標準ではインストールされない。 明示的に、 make install_<file>コマンドを実行する必要がある。
|
qDebug関数の出力を抑止する
標準の設定では、リリースビルドでもqDebug関数の出力が有効になっている。
リリースビルドでqDebug関数で出力しないように設定するには、プロジェクトファイル(.pro)に以下を追記する。
CONFIG(release, debug|release):DEFINES += QT_NO_DEBUG_OUTPUT
qInfo関数の出力を抑止する場合、プロジェクトファイル(.pro)に以下を追記する。
CONFIG(release, debug|release):DEFINES += QT_NO_INFO_OUTPUT
qWarning関数の出力を抑止する場合、プロジェクトファイル(.pro)に以下を追記する。
CONFIG(release, debug|release):DEFINES += QT_NO_WARNING_OUTPUT
qCritical関数の出力を抑止する場合、プロジェクトファイル(.pro)に以下を追記する。
CONFIG(release, debug|release):DEFINES += QT_NO_CRITICAL_OUTPUT
qFatal関数の出力を抑止する場合、プロジェクトファイル(.pro)に以下を追記する。
CONFIG(release, debug|release):DEFINES += QT_NO_FATAL_OUTPUT
デプロイ時のディレクトリの変更
デプロイ時において、DebugモードとReleaseモードのディレクトリを変更する時、.proファイルに以下の設定を記述する。
以下の設定により、デプロイ時のDebugディレクトリ名は、"プロジェクト名 + d"となる。
TARGET_NAME = $${TARGET}
if(debug)
{
TARGET_NAME = $${TARGET}d
}
インストール時のディレクトリの変更
qmakeコマンド実行時のインストールディレクトリは、targetパラメータで指定する。
以下の例では、.proファイルに変数PREFIXを定義して、標準のインストールディレクトリを/usr/localディレクトリとしており、
qmakeコマンド実行時にPREFIXオプションを使用した場合は、その該当ディレクトリをインストールディレクトリとしている。
# ...略
isEmpty(PREFIX) {
PREFIX = /usr/local
}
#target = Software_Name
target.path = $${PREFIX}/
INSTALLS += target
# ...略
上記の設定を記述した後、qmakeコマンドにPREFIXオプションを付加して実行する。
qmake ./<Qtプロジェクト>.pro PREFIX=$HOME/InstallSoftware/Software_Name
DEFINESマクロ
応用 : qmakeコマンド実行時にコンパイルするファイルを変更する
以下の例では、qmakeコマンドの実行時において、MACHINE=pinephoneオプションを付加することで、QMLファイルを動的に変更することができる。
qmake ./〜.pro MACHINE=pinephone
# .proファイル
# ...略
isEqual(MACHINE, pinephone) {
DEFINES += "PINEPHONE" \
}
# ...略
// main.cppファイル
int main(int argc, char *argv[])
{
// ...略
#ifdef PINEPHONE
const QUrl url(QStringLiteral("qrc:/mainPinePhone.qml"));
#else
const QUrl url(QStringLiteral("qrc:/main.qml"));
#endif
// ...略
}
messageマクロ
qmakeコマンド実行時において、ターミナルにメッセージを出力する場合は、messageマクロを使用する。
message(<メッセージ内容>) # 例1. "Build Start"と表示する message(Build Start) # 例2. 変数DESTDIRの内容を出力する message(DESTDIR: ($$DESTDIR))
最適化ビルド
以下の設定を、qmake時のオプションに指定する、または、.proファイルに追記する。
これで、最適化フラグが-O2から-O3に置き換わる。
CONFIG += optimize_full
以下の設定は、リリースビルドのみに適用する。
CONFIG(release, debug|release) {
CONFIG += optimize_full
}
バージョン情報
QMakeを使用してビルドされた実行ファイルまたはライブラリに対して、自動的にバージョンを付加することができる。
以下の例では、SVNを使用して現在のバージョンを取得している。(プロジェクトのバージョンを返すコマンドで代用すること)
まず、.proファイルに以下の設定を追記する。
VERSION = $$system(svn info -r HEAD . | grep 'Changed\ Rev' | cut -b 19-)
!isEmpty(VERSION){
VERSION = 0.$${VERSION}
}
次に、ソフトウェアのバージョンを設定する。
VERSTR = '\"$${VERSION}\'' # バージョンの文字列を引用符で囲む
DEFINES += VER=\"$$${VERSTR}\" # バージョン文字列を含むVERマクロの作成
上記の設定により、VERマクロを任意のcppファイル / ヘッダファイルで使用することにより、引用符で囲まれたバージョンを取得することができる。
#include <iostream>
int main()
{
std::cout << "VERSION: " << VER << std::endl;
return 0;
}