7

Qt 5.1、特に qmake のドキュメントを読んでいるときに、qmake CONFIG() 関数のドキュメントに記載されている説明に困惑しました。関数の引数が 1 つのバージョンは完全に理解できましたが、引数が 2 つのバージョンはまったく意味がありません。Qt 5.1のドキュメントには次のように記載されているため、「アクティブ構成」の定義がないために混乱が生じていると思います。

この関数は、CONFIG 変数に配置された変数をテストするために使用できます。これはスコープと同じですが、アクティブな構成をテストするために 2 番目のパラメーターを渡すことができるという利点があります。CONFIG 変数では値の順序が重要であるため (つまり、最後のセットが相互に排他的な値のアクティブな構成と見なされます)、考慮すべき値のセットを指定するために 2 番目のパラメーターを使用できます。

私は完全に困惑しており、この2番目の引数から実際的な意味を理解できないため、この「アクティブ構成」の概念についての説明をいただければ幸いです。

4

1 に答える 1

17

CONFIG 変数には、"release" と "debug" の両方など、競合するオプションを含めることができます。CONFIG に「release」と「debug」が同時に含まれている場合は、「release」または「debug」のいずれかが有効です。CONFIG で競合するオプションの解釈は順序によって異なります。最後の 1 つのセットが有効な or と見なされactive configます。

1 つのパラメータで CONFIG() を使用すると、オプションが CONFIG 変数に存在するかどうかがわかります。「リリース」と「デバッグ」の両方が存在する場合、CONFIG(リリース) と CONFIG(デバッグ) の両方が true を返します。

2 つのパラメーターを指定して CONFIG() を使用すると、オプションが有効かどうか、有効かどうかがわかりますactive config。CONFIG(debug, debug|release) は、「debug」オプションと「release」オプションの中で「debug」が最後 (したがって、アクティブ) であるかどうかをテストします。

この質問と回答も参照してください。

編集:

Qt Creator で新しいプロジェクトを作成し、生成された .pro ファイルを開き、下部に次の行を追加しました: message($${CONFIG})qmake の実行時に CONFIG の内容を確認できるようにします。.pro ファイル全体を示します。

QT       += core
QT       -= gui
TARGET = QMakeConfigTest
CONFIG   += console
CONFIG   -= app_bundle
TEMPLATE = app
SOURCES += main.cpp
message($${CONFIG})

CONFIG が変更されている行が 2 行あり、オプションが 1 つだけ追加され、1 つが削除されています。次に、Release Build を選択して qmake を実行します。これは、コンパイル出力ウィンドウに表示されるものです。

08:53:49: プロジェクト QMakeConfigTest のステップを実行しています...

08:53:49: 開始: "C:\Qt\Qt5.0.2\5.0.2\msvc2010\bin\qmake.exe" C:\QMakeConfigTest\QMakeConfigTest.pro -r -spec win32-msvc2010

プロジェクト メッセージ: lex yaccデバッグ例外depend_includepath testcase_targets import_plugins import_qpa_plugin rtti_off incremental_off windows qt warn_on release link_prl incremental flat precompile_header autogen_precompile_source debug_and_release debug_and_release_target embedded_manifest_dll embedded_manifest_exe copy_dir_files release shared rtti qpa win32 msvc debug DebugBuild console Debug build_pass

08:53:49: プロセス「C:\Qt\Qt5.0.2\5.0.2\msvc2010\bin\qmake.exe」は正常に終了しました。

08:53:49: 経過時間: 00:00。

ご覧のとおり、CONFIG 変数にはconsole、.pro ファイルに追加されたオプションの他に、多くのデフォルト オプションが含まれています。debug と release の両方が 2 回、debug_and_release が 1 回含まれています。

これらのデフォルトのオプションはどこから来たのですか? これらは、 というディレクトリからロードされる .prf および .conf ファイルで定義されますmkspecs。したがって、コメントで尋ねた質問に対する答えは、.pro ファイルが qmake によって処理される前に、コンパイラとプラットフォームに基づいて他のいくつかのファイルが前処理されるということです。これらのファイルは、同じオプションを複数回追加でき、競合するオプションを CONFIG 変数に追加できます。

の内容は次のC:\Qt\Qt5.0.2\5.0.2\msvc2010\mkspecs\features\default_pre.prfとおりです。

# This file is loaded by qmake right before each actual project file.
# Note that evaluating variable assignments from the command line
# still happens in between these two steps.

load(exclusive_builds)
CONFIG = \
    lex yacc debug exceptions depend_includepath \
    testcase_targets import_plugins import_qpa_plugin \
    $$CONFIG

ご覧のとおり、最初の 8 つのデフォルト オプションがこのファイルで定義されています。

の内容C:\Qt\Qt5.0.2\5.0.2\msvc2010\mkspecs\features\win32\default_pre.prf:

CONFIG = rtti_off incremental_off windows $$CONFIG
load(default_pre)

の関連部分C:\Qt\Qt5.0.2\5.0.2\msvc2010\mkspecs\features\spec_pre.prf:

# This file is loaded by qmake right before loading the qmakespec.
# At this point, the built-in variables have been set up and the project's
# .qmake.super was read (if present).

CONFIG = qt warn_on release link_prl
QT = core gui

Qt Creator は次のオプションで qmake.exe を実行します: -spec win32-msvc2010. -spec オプションに関する qmake マニュアルを見てみましょう。

-spec spec: qmake はプラットフォームおよびコンパイラ情報へのパスとしてspecを使用し、QMAKESPEC の値は無視されます。

の最初の数行C:\Qt\Qt5.0.2\5.0.2\msvc2010\mkspecs\win32-msvc2010\qmake.conf:

#
# qmake configuration for win32-msvc2010
#
# Written for Microsoft Visual C++ 2010
#

MAKEFILE_GENERATOR      = MSBUILD
QMAKE_PLATFORM          = win32
CONFIG                  += incremental flat precompile_header autogen_precompile_source debug_and_release debug_and_release_target embed_manifest_dll embed_manifest_exe
DEFINES                 += UNICODE WIN32
QMAKE_COMPILER_DEFINES  += _MSC_VER=1600 WIN32
于 2013-08-11T08:02:31.680 に答える