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の設定」を参照すること。
サードパーティ製ライブラリの使用
サードパーティ製ライブラリの詳細は、「サードパーティ製ライブラリを使用する」を参照すること。
ヘッダファイルのプリコンパイル
大規模なプロジェクトでは、プリコンパイルされたヘッダファイルを使用することにより、ビルドプロセスを高速化することが可能である。
詳細を知りたい場合は、「プリコンパイルされたヘッダファイルの使用」を参照すること。
ユーザ定義の変数
qmake
コマンドの実行時において、変数に値を代入する。
VAR = foobar
qmake
コマンドの実行時において、変数の値を参照する。
$$VAR または $${VAR} (周囲のテキストと区別するために囲む)
make
コマンド(qmake
コマンドではない)の実行時において、環境変数の値を参照する。
$(VAR)
qmake
コマンドの実行時において、環境変数の値を参照する。
$$(VAR)
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 オプションも設定する必要がある。
|
create_libtool | 現在ビルドされているライブラリのlibtool(.la拡張子)ファイルを作成する。 |
create_pc | 現在ビルドされているライブラリのpkg-config(.pc拡張子)ファイルを作成する。 |
no_batch | NMakeを使用する場合のみ有効である。 NMakeのバッチルールや推論ルールの生成を無効にする。 |
dont_recurse | 現在のサブプロジェクトのqmake再帰を抑制する。 |
no_include_pwd | カレントディレクトリを変数INCLUDEPATHS に追加しない。
|
compile_included_sources | qmake コマンドは、他のソースコードファイルにインクルードされているソースファイルをコンパイルする。デフォルトでは、このオプションは有効である。 |
skip_target_version_ext | Windowsにおいて、DLLファイル名に自動付加されるバージョンナンバーを抑制する。 |
suppress_vcproj_warnings | Visual Studioプロジェクトジェネレータの警告を抑制する。 |
windeployqt | リンク後、自動的にwindeployqtを起動して、出力をデプロイメントアイテムとして追加する。 |
strict_c | C言語のコンパイラ拡張のサポートを無効にする。 デフォルトでは、このオプションは有効である。 |
strict_c++ | C++言語のコンパイラ拡張のサポートを無効にする。 デフォルトでは、このオプションは有効である。 |
Qtプロジェクトの設定
変数CONFIG
は、Qtプロジェクトの機能を指定することもできる。
Qtプロジェクトは、デバッグモード、リリースモード、デバッグモードとリリースモードの同時でビルドすることができる。
debug
オプションとrelease
オプションを別々に両方を指定する場合、最後に指定されたものが有効になる。
debug_and_release
オプションを指定する場合、qmake
コマンドが生成するMakefileには、両方のオプションをビルドするルールが含まれる。
これは次のようにして呼び出すことができます。
make all # debug_and_releaseオプションを指定して、デバッグモードとリリースモードの同時でビルドする場合
変数CONFIG
にbuild_all
オプションを記述する場合、プロジェクトをビルドする時はこのルールがデフォルトになる。
※注意
変数CONFIG
で指定された各オプションは、スコープ条件として使用することも可能である。
また、組み込みのCONFIG()
関数を使用して、特定の構成オプションが存在するかどうかを確認することもできる。
組み込みのCONFIG()
関数の詳細を知りたい場合は、Qtの公式Webサイトを参照すること。
以下の例では、opengl
オプションが指定されているかどうかを確認している。
CONFIG(opengl) { message(Building with OpenGL support.) } else { message(OpenGL support is not available.) }
詳細を知りたい場合は、Qtの公式Webサイトにあるスコープの使用を参照すること。
下表に、Qtプロジェクトの種類を定義するオプションを示す。
(これらのオプションの中には、関連するプラットフォームで使用した場合にのみ有効になるものがあることに注意する)
オプション | 説明 |
---|---|
qt | Qtソフトウェアを示すオプションである。 Qtライブラリに対してリンクする必要があることを示す。 また、変数 QT を使用して、必要な追加のQtライブラリを指定することができるようになる。qt オプションはデフォルトで追加されている、Qtプロジェクト以外でqmake コマンドを実行する場合は削除すること。
|
x11 | X11ソフトウェアまたはX11ライブラリであることを指定する。 Qtプロジェクトの場合、この値は不要である。 |
console | ターゲットは、コンソールソフトウェアである。 適切なインクルードパス、コンパイラフラグ、ライブラリは自動的にプロジェクトに追加される。 クロスプラットフォーム向けの場合は、 cmdline オプションを指定することを推奨する。
|
cmdline | ターゲットは、クロスプラットフォーム向けのコマンドラインソフトウェアである。 Windowsでは CONFIG += console 、MacOSの場合はCONFIG -= app_bundle を意味する。
|
shared dll |
ターゲットは共有オブジェクト(.soまたは.dll)である。 ターゲットプラットフォーム用の適切な接尾辞(.soまたは.dll)を持つ共有ライブラリファイルが作成される。 適切なインクルードパス、コンパイラフラグ、ライブラリが自動的にQtプロジェクトに追加される。 dll オプションは全てのプラットフォームで使用できることに注意する。
|
static staticlib |
ターゲットはスタティックライブラリ(.aまたは.lib)である。 適切なコンパイラフラグは、自動的にQtプロジェクトに追加される。 |
plugin | ターゲットはプラグイン(.aまたは.lib)である。 これにより、 dll オプションも有効になる。
|
metatypes | Qtプロジェクトに"<name>_metatypes.json"ファイルを作成する。 <name>は、変数 TARGET のベースネーム(全て小文字)である。
|
qmltypes | qmltypes オプションは、metatypes オプションを意味する。C++で定義されたQMLの型を自動的に登録する。 また、Qtプロジェクトに"<template>.qmltypes"ファイルを作成する。 <template>は、 plugin オプションが設定されている場合はplugins 、設定されていない場合は変数TEMPLATE の値になる。C++からQMLの型を定義する方法の詳細は、Qtの公式ドキュメントを参照すること。 |
designer | ターゲットは、Qt Designerのプラグインである。 |
no_lflags_merge | 変数LIBS に格納されたライブラリのリストが、使用される前に一意の値のリストに還元されないことを保証する。
|
testcase | ターゲットは自動テストである。 テストを実行するため、生成されたMakefileにチェックターゲットが追加される。 Makefileを生成する時にのみ関連するオプションである。 |
insignificant_test | 自動テストの終了コードを無視するオプションである。 このオプションは、 testcase オプションも設定されている場合にのみ有効である。
|
windows | ターゲットは、Windowsソフトウェア(実行ファイルのみ)である。 適切なインクルードパス、コンパイラフラグ、ライブラリは自動的にQtプロジェクトに追加される。 |
largefile | ラージファイルをサポートする。 Linuxプラットフォームでのみ有効である。 |
separate_debug_info | ライブラリのデバッグ情報を個別のファイルに格納する。 Linuxプラットフォームでのみ有効である。 |
例えば、ソフトウェアがQtライブラリを使用しており、かつ、デバッグモードでビルドする場合、Qtプロジェクトファイルには、以下に示すオプションが含まれる。
CONFIG += qt debug
QT
Qtプロジェクトで使用されるQtライブラリを指定する変数である。
Qtライブラリを指定することにより、そのヘッダファイルをインクルードできるようになり、バイナリにリンクされる。
変数CONFIG
にqt
オプションを指定している場合、qmake
コマンドのQtソフトウェアに対するサポートが有効になる。
これにより、Qtソフトウェアで使用されるQtライブラリを細かく調整することが可能になる。
以下の例では、Qt XMLライブラリとQtネットワークライブラリを有効にしている。
QT += network xml
※注意
QtのGUIソフトウェアでは、変数QT
は、デフォルトでcore
オプションとgui
オプションを含む。
Qtプロジェクトをコンソールソフトウェアとして構築する場合、-=
演算子で除外する必要がある。
以下の例では、最小限のQtプロジェクトがビルドされる結果となります。
QT -= gui # Qt Coreライブラリのみを使用する場合
下表に、変数QT
に追加できるQtライブラリの一部を示す。
詳細を知りたい場合は、Qtの公式ドキュメントを参照すること。
- Qt 5.15(LTS)
- Qt 6.2(LTS)
オプション | ライブラリ | 説明 |
---|---|---|
core | Qt Core | 他のQtライブラリで使用される非グラフィカルなコアクラス。 |
gui | Qt GUI | グラフィカルユーザインターフェイス(GUI)コンポーネントの基本クラス。 OpenGLを含む。 |
widgets | Qt Widgets | Qt GUIをC++ウィジェットで拡張するためのクラス。 |
dbus | Qt D-Bus | D-Busプロトコルでプロセス間通信を行うためのクラス。 |
multimedia | Qt Multimedia | オーディオ、ビデオ、ラジオ、カメラ機能のためのクラス。 |
multimediawidgets | Qt Multimedia Widgets | マルチメディア機能を実装するためのウィジェットベースのクラス。 |
network | Qt Network | ネットワークプログラミングを簡単かつポータブルにするためのクラス。 |
qml | Qt QML | QML言語とJavaScript言語のためのクラス。 |
quick | Qt Quick | カスタムユーザインタフェースを持つ高度で動的なアプリケーションを構築するための宣言型フレームワーク。 |
quickcontrols2 | Qt Quick Controls | デスクトップ、組み込み、モバイルデバイス用の高性能なユーザインターフェースを作成するための軽量なQML型を提供する。 |
quickcontrols2 | Qt Quick Dialogs | Qt Quickソフトウェアからシステムダイアログを作成して、対話するためのアイテム。 |
quickcontrols2 | Qt Quick Layouts | Qt Quick 2ベースのアイテムをユーザインターフェイスに配置するために使用するアイテム。 |
QMLテストケースの場合 CONFIG += qmltestcase C++のみのテストプロジェクトの場合 QT += qmltest |
Qt Quick Test | QMLソフトウェアのためのユニットテストフレームワークであり、テストケースはJavaScriptの関数として記述される。 ※注意 Qt Quick Testには、バイナリ互換性保証は適用されない。 しかし、ソースとの互換性は保たれる。 |
concurrent | Qt Concurrent | 低レベルのスレッドプリミティブを使用せずにマルチスレッドプログラムを記述するためのクラス。 |
sql | Qt SQL | SQLを使ったデータベース統合のためのクラス。 |
svg | Qt SVG | SVGファイルを表示するためのクラス。 SVG 1.2 Tiny標準のサブセットをサポートする。 Qt Widgetを使用する場合は、SVGファイルをレンダリングするためのサポートを提供する。 |
xml | Qt XML | DOM(Document Object Model)APIでXMLを扱う。 |
bluetooth | Qt Bluetooth | Bluetoothハードウェアへのアクセスを提供する。 |
testlib | Qt Test | QtソフトウェアやQtライブラリをユニットテストするためのクラス。 ※注意 Qt Testには、バイナリ互換性保証は適用されない。 しかし、ソースとの互換性は保たれる。 |
TEMPLATE
Qtプロジェクトファイルは、原則として、1ファイル1ターゲットである。
変数TEMPLATE
は、Qtプロジェクトの種類を指定する。
- app
- ソフトウェア
- lib
- ライブラリまたはプラグイン
- ※注意
- プラグインの場合は、
CONFIG += plugin
も設定すること。 - Qt Designerプラグインの場合は、併せて、
QT += uiplugin
も設定すること。
- subdir
- サブディレクトリ
- aux
- Makefileを使用してもビルドしない。
- 例えば、プロジェクトがインタプリタ言語で書かれているため、ターゲットを作成するためにコンパイラを起動する必要がない場合に使用することがある。
- ※注意
- auxは、Makefileベースのジェネレータでのみ使用可能である。
- vcxprojとXcodeジェネレータでは動作しない。
- vcapp
- ソフトウェアをビルドするためのVisual Studioプロジェクトファイルである。
- vclib
- ライブラリをビルドするためのVisual Studioプロジェクトファイルである。
- vcsubdirs
- サブディレクトリでプロジェクトをビルドするためのVisual Studioソリューションファイルである。
変数TEMPLATE
にsubdirs
を使用する場合、qmake
コマンドは指定された各サブディレクトリを検索して、各Qtプロジェクトファイルを処理する。
make
コマンドを実行するため、各プラットフォーム上でMakefileを生成する。
変数SUBDIRS
は、処理する各Qtプロジェクトファイルのディレクトリを格納するために使用される。
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
LEXSOURCES
ソフトウェアのLexソースコードファイルのリストを指定する。
lexファイルをビルドするため、全ての依存関係、ソースコードファイル、ヘッダファイルが自動的にプロジェクトに追加される。
LEXSOURCES = lexer.l
YACCSOURCES
プロジェクトに含めるYaccソースコードファイルのリストを指定する。
全ての依存関係、ソースコードファイル、ヘッダファイルが自動的にプロジェクトに追加される。
YACCSOURCES = moc.y
FORMS
コンパイルを行う前にuicで処理するUIファイルを指定する。
UIファイルをビルドするために必要な全ての依存関係、ヘッダファイル、ソースコードファイルは自動的にプロジェクトに追加される。
FORMS += mainwindow.ui \ subwindow.ui
RESOURCES
Qtプロジェクトのリソースコレクションファイル(qrc)の名前を指定する。
リソースコレクションファイルの詳細を知りたい場合は、Qt Resource Systemを参照すること。
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
オプションを使用することは非推奨である。
これは、マルチコアのビルドを遅くする可能性がある。
ビルド順を定義する以外に、変数SUBDIRS
に追加の修飾子を付加することにより、変数SUBDIRS
のデフォルトの動作を変更することが可能である。
下表に、サポートされている修飾子を示す。
修飾子 | 説明 |
---|---|
.subdir | 変数SUBDIRS の値の代わりに、指定されたサブディレクトリを使用する。
|
.file | サブプロジェクトプロファイルを明示的に指定する。 この時、 .subdir 修飾子と同時に使用できない。
|
.depends | このサブプロジェクトは指定されたサブプロジェクトに依存することを示す。(複数可) |
.makefile | サブプロジェクトのMakefileを指定する。 Makefileを使用するプラットフォームでのみ利用可能である。 |
.target | このサブプロジェクトに関連するMakefileターゲットに使用されるベース文字列を指定する。 Makefileを使用するプラットフォームでのみ利用可能である。 |
以下の例では、2つのサブディレクトリを定義して、各サブディレクトリが変数SUBDIRS
で指定したディレクトリとは異なるディレクトリに存在しており、
サブディレクトリの1つが他のものより先に構築されなければならないとする。
(例では、MySoftwareはappディレクトリ、MyLibraryはlibディレクトリに存在する)
SUBDIRS += MySoftware \ MyLibrary MySoftware.subdir = app MySoftware.depends = MyLibrary MyLibrary.subdir = lib
DESTDIR
生成したターゲットファイルの生成先を指定する。
変数DESTDIR
は、インストールディレクトリではなく、ビルドした結果のバイナリファイルが配置される場所である。
DEFINES
ビルド時に追加されるプロプロセッサ(#define
で定義される)を格納する。
DEPENDPATH
依存関係を解決するため、qmake
コマンドが検索するディレクトリのリストを指定する。
ソースコードにインクルード(#include
)したヘッダファイルを、qmake
コマンドがクロールする時に使用される。
変数INCLUDEPATH
では、変更される可能性の低い外部ライブラリのヘッダファイルまで検索する場合は時間が掛かる。
そのため、外部ライブラリのヘッダファイルを使用する場合は、変数DEPENDPATH
を使用した方がよい。
VPATH
qmake
コマンドが開くことができないファイルのパスを指定する。
例えば、qmake
コマンドが変数SOURCES
を検索している時、開くことができないエントリを見つけた場合、
変数VPATH
のリスト全体を検索して、自分自身でそのファイルを見つけることができるかどうかを確認する。
DEF_FILE
変数TEMPLATE
でapp
を指定、かつ、Windowsの場合のみ使用できる変数である。
ソフトウェアにリンクされる.defファイルを指定する。
VERSION
変数TEMPLATE
にapp
が指定されている場合はソフトウェアのバージョン番号、
変数TEMPLATE
にlib
が指定されている場合はライブラリのバージョン番号を指定する。
例. win32:VERSION = 1.2.3.4 # <メジャー番号>.<マイナー番号>.<パッチ番号>.<ビルド番号> else:VERSION = 1.2.3 # <メジャー番号>.<マイナー番号>.<パッチ番号>
Windowsでは、変数RC_FILE
と変数RES_FILE
が設定されていない場合、.rcファイルの自動生成をトリガする。
生成される.rcファイルには、FILEVERSION項目とPRODUCTVERSION項目にメジャー、マイナー、パッチレベル、ビルド番号が記入される。
各番号は0から65535までの範囲である必要がある。
コンパイラの設定
GCCやG++コンパイラ等を標準以外に変更する場合、プロジェクトファイル(.pro拡張子)に以下の設定を追記する。
- QMAKE_CC
- C言語のソースコードを含むプロジェクトをビルドする時に使用されるC言語のコンパイラを指定する。
QMAKE_CC = /<GCCのインストールディレクトリ>/bin/gcc-10.2
- また、環境変数PATHにGCCやG++等のパスを設定している場合、以下のように、コンパイラのファイル名だけで指定することができる。
QMAKE_CC = gcc-10.2
QMAKE_CC
オプションは、CONFIG
オプションよりも上に記述する。
- QMAKE_CXX
- C++言語のソースコードを含むプロジェクトをビルドする時に使用されるC++言語のコンパイラを指定する。
QMAKE_CXX = /<GCCのインストールディレクトリ>/bin/g++-10.2
- また、環境変数PATHにGCCやG++等のパスを設定している場合、コンパイラのファイル名だけで指定することができる。
QMAKE_CXX = g++-10.2
QMAKE_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によって処理され、変更する必要はほとんど無い。
※注意
C++20を使用する場合、CONFIG
オプションにc++20
を指定して、かつ、QMAKE_CXXFLAGS
オプションに-fno-sized-deallocation
を指定する必要がある。
CONFIG += c++20
QMAKE_CXXFLAGS += -std=c++20 -fno-sized-deallocation
pkg-configツールの使用
Qtのプロジェクトファイルにおいて、変数PKGCONFIG
を設定することにより、pkg-configツールを使用して外部ライブラリの情報を取得することができる。
これにより、ビルド時にpkg-configツールが使用されて、指定した外部ライブラリの情報を取得することができる。
まず、pkg-configツールを実行して、ライブラリファイルの存在を確認することが重要である。
pkg-config --libs --cflags <ライブラリ名>
推奨される記述
# PKGCONFIG変数の設定
# Pkg-configを使用する
CONFIG += link_pkgconfig
# 単一のライブラリを指定する場合
PKGCONFIG += <ライブラリ名>
# 例: Systemdライブラリを使用する場合
PKGCONFIG += libsystemd
# 複数のライブラリを指定する場合 :
# PKGCONFIG += <ライブラリ名 1> <ライブラリ名 2> <ライブラリ名 3> ...
変数PKGCONFIG
は、pkg-configツールを使用してライブラリの情報を取得するためのものであるため、ライブラリのフルパスを指定することは一般的ではない。
pkg-configツールは、ライブラリの場所やヘッダファイルの場所等を提供するため、フルパスを指定する必要はない。
もし、ライブラリが一般的の場所にインストールされていない場合や特別な状況でフルパスを指定する場合は、変数LIBS
、変数INCLUDEPATH
にフルパスを指定する。
ただし、特別な理由がない限り (例えば、非標準のライブラリ配置等)、Pkg-configの情報のみを使用することを推奨する。
非推奨の記述
また、以下に示すような記述は非推奨である。
# 非推奨の記述方法
# Systemdライブラリを使用する場合
PKGCONFIG += libsystemd
LIBS += -L/usr/lib64 -lsystemd
この記述は冗長であり、潜在的な問題を引き起こす可能性がある。
- 重複したリンク指定
- Pkg-configを使用することにより、既に必要なリンク情報を提供しており、ライブラリの場所とリンクするライブラリ名が含まれている。
- そのため、変数PKGCONFIGにライブラリ名を指定する必要はない。
- バージョン不一致のリスク
- 変数LIBSにおいて、明示的にパスとライブラリを指定する場合、Pkg-configが提供する情報と矛盾する可能性がある。
- これにより、異なるバージョンのライブラリがリンクされる、または、互換性の問題が発生する可能性がある。
- 移植性の低下
- ハードコードされたパス (/usr/lib64等) は、異なるシステムや環境では正しくない可能性がある。
- Pkg-configを使用するメリットの1つは、システム間の違いを抽象化できることである。
カスタムディレクトリを指定する場合
非標準のライブラリ配置、例えば任意のディレクトリにライブラリをインストールしている場合、Pkg-configの設定と直接のライブラリパス指定を組み合わせる必要がある。
以下の例では、$HOMEディレクトリにインストールされたSystemdライブラリを使用している。
この場合、該当するディレクトリにライブラリのpcファイルが存在するかどうかを確認すること。
# 環境変数$HOMEの値を取得
HOME = $$(HOME)
# Pkg-configのパスを設定
# カスタムのPpkg-config設定を指定して、該当ディレクトリにある.pcファイルを検索するようPkg-configに指示する
QMAKE_PKG_CONFIG = PKG_CONFIG_PATH=$$HOME/lib/pkgconfig pkg-config
# Pkg-configを使用
# pkg-configを使用してlibsystemdの設定を取得する
CONFIG += link_pkgconfig
PKGCONFIG += libsystemd
# インクルードパスを追加
# コンパイラにカスタムインクルードディレクトリを追加する
INCLUDEPATH += $$HOME/include
# リンカにカスタムライブラリパスとリンクするライブラリを指定する
LIBS += -L$$HOME/lib -lsystemd
インクルードの設定
- 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]/imageformats
INSTALLS += 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> コマンドを実行する必要がある。
|
プラットフォーム識別子
Qtにはmkspecsディレクトリがあり、サポートする全ての環境の固有情報がデータベースになっている。
- aix
- android
- blackberry
- bsd
- cygwin
- darwin
- freebsd
- hpux
- hurd
- ios
- irix
- linux
- lynxos
- mac
- macx
- maemo
- mingw
- netbsd
- openbsd
- osx
- posix
- qnx
- sco
- solaris
- tru64
- unix
- unixware
- win32
- wince
- winphone
- winrt
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;
}