Qtの設定 - qmake

提供:MochiuWiki - SUSE, Electronic Circuit, PCB
ナビゲーションに移動 検索に移動

概要

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 スレッドサポートを有効にする。
変数CONFIGqtが含まれている場合は、デフォルトで有効に設定されている。
no_utf8_source QtプロジェクトのソースファイルにUTF-8エンコーディングを使用せずに、コンパイラのデフォルトの設定を使用する。
hide_symbols 未指定の場合は、コンパイラのデフォルトが使用される。
バイナリ内のシンボルのデフォルトの可視性を非表示に設定する。
depend_includepath デフォルトで有効に設定されている。
変数INCLUDEPATHの値を変数DEPENDPATHに付加することを有効にする。
lrelease 変数TRANSLATIONSと変数EXTRA_TRANSLATIONSにリストされている全てのファイルに対して、lreleaseコマンド(翻訳)を実行する。
変数QMAKE_LRELEASE_FLAGSlreleaseコマンドのオプションを記述する。

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オプションを指定して、デバッグモードとリリースモードの同時でビルドする場合


変数CONFIGbuild_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ライブラリを指定することにより、そのヘッダファイルをインクルードできるようになり、バイナリにリンクされる。

変数CONFIGqtオプションを指定している場合、qmakeコマンドのQtソフトウェアに対するサポートが有効になる。
これにより、Qtソフトウェアで使用されるQtライブラリを細かく調整することが可能になる。

以下の例では、Qt XMLライブラリとQtネットワークライブラリを有効にしている。

QT += network xml


※注意
QtのGUIソフトウェアでは、変数QTは、デフォルトでcoreオプションとguiオプションを含む。

Qtプロジェクトをコンソールソフトウェアとして構築する場合、-=演算子で除外する必要がある。
以下の例では、最小限のQtプロジェクトがビルドされる結果となります。

QT -= gui  # Qt Coreライブラリのみを使用する場合


下表に、変数QTに追加できるQtライブラリの一部を示す。
詳細を知りたい場合は、Qtの公式ドキュメントを参照すること。

オプション ライブラリ 説明
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ソリューションファイルである。


変数TEMPLATEsubdirsを使用する場合、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


複数の依存関係を指定することもでき、それらは全て依存するターゲットの前にビルドされる。

※注意
変数CONFIGorderedオプションを使用することは非推奨である。
これは、マルチコアのビルドを遅くする可能性がある。

ビルド順を定義する以外に、変数SUBDIRSに追加の修飾子を付加することにより、変数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

変数TEMPLATEappを指定、かつ、Windowsの場合のみ使用できる変数である。
ソフトウェアにリンクされる.defファイルを指定する。

VERSION

変数TEMPLATEappが指定されている場合はソフトウェアのバージョン番号、
変数TEMPLATElibが指定されている場合はライブラリのバージョン番号を指定する。

例.
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=c11QMAKE_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++14QMAKE_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;
 }