「CMake - Qtコマンド」の版間の差分
タグ: 差し戻し済み |
タグ: 差し戻し済み |
||
205行目: | 205行目: | ||
*: Qt::で始まるインポートされたターゲットを隠す。 | *: Qt::で始まるインポートされたターゲットを隠す。 | ||
*: 代わりに、Qt6::で始まるターゲットを使用する必要がある。 | *: 代わりに、Qt6::で始まるターゲットを使用する必要がある。 | ||
<br> | |||
<u>※注意</u><br> | |||
<u>例えば、インポートされたQt::Coreターゲットには、Qt6::Coreターゲットで利用可能なターゲットプロパティは無いことに注意する。</u><br> | |||
<br> | <br> | ||
以下の例では、まず、Qt6ライブラリを探索する。<br> | 以下の例では、まず、Qt6ライブラリを探索する。<br> |
2024年6月24日 (月) 05:13時点における版
概要
Qt6 CoreのCMakeコマンド
Qt6 CoreのCMakeコマンド一覧
下表のCMakeコマンドは、Qt6::Coreが読み込まれた時に定義される。
find_package(Qt6 REQUIRED COMPONENTS Core)
CMakeコマンド | 説明 |
---|---|
qt_add_big_resources | 大きなバイナリリソースをオブジェクトコードにコンパイルする。 |
qt_add_binary_resources | QtリソースファイルのリストからRCCファイルを生成する。 |
qt_add_executable | プラットフォーム固有のタイプのアプリケーションターゲットを生成および確定する。 |
qt_add_library | ライブラリを生成および確定する。 |
qt_add_plugin | Qtプラグインターゲットを生成する。 |
qt_add_resources | バイナリリソースをソースコードにコンパイルする。 |
qt_allow_non_utf8_sources | ソースファイルがWindows用のUTF-8として強制的に扱われるのを防ぐ。 |
qt_android_add_apk_target | androiddeployqtを実行して、APKを生成するビルドターゲットを定義する。 |
qt_android_apply_arch_suffix | ターゲットバイナリの名前にアーキテクチャ固有のサフィックスを含めるように設定する。 |
qt_android_generate_deployment_settings | androiddeployqtが必要とするデプロイ設定ファイルを生成する。 |
qt_deploy_qt_conf | デプロイ時に、qt.confファイルを書き込む。 |
qt_deploy_runtime_dependencies | 実行ファイルに必要なQtプラグイン、Qtライブラリ、非Qtライブラリをデプロイする。 |
qt_deploy_translations | 実行ファイルが必要とするQtの翻訳をデプロイする。 |
qt_disable_unicode_defines | ユニコード関連のコンパイラ定義がターゲット上で自動的に設定されるのを防ぐ。 |
qt_extract_metatypes | Qtターゲットからmetatypesを抽出して、関連するmetatypes.jsonファイルを生成する。 |
qt_finalize_project | Qtプロジェクトに関連するプラットフォーム固有のタスクを処理する。 |
qt_finalize_target | Qtターゲットに関連するプラットフォーム固有のタスクを処理する。 |
qt_generate_deploy_app_script | アプリケーションのデプロイスクリプトを生成する。 |
qt_generate_deploy_script | カスタムデプロイスクリプトを生成する。 |
qt_generate_moc | 入力ファイルに対して、mocを呼び出す。 |
qt_import_plugins | インポートあるいは除外するプラグインのカスタムセットを指定する。 |
qt_policy | QtのCMake APIのデフォルトの振る舞いを変更する。 |
qt_set_finalizer_mode | ターゲットのファイナライズをカスタマイズする。 |
qt_standard_project_setup | プロジェクト全体のデフォルトを標準的な配置に設定する。 |
qt_wrap_cpp | ソースからmocファイルを生成する。 |
qt_add_resources / qt6_add_resources
バイナリリソースをソースコードにコンパイルするコマンドである。
リソースを追加するには、コマンドの第1引数に変数名かターゲットを渡す。
第1引数に変数名を渡すと、qt_add_resourcesコマンドはリソースコンパイラ(rcc)を使用してQtリソースファイルからソースコードを生成する。
生成されたソースファイルへのパスは、<VAR>に追加される。
第1引数としてターゲットを渡すと、関数は指定された<FILES>を含む<RESOURCE_NAME>という名前のリソースを生成する。
リソースは自動的に<TARGET>にリンクされる。
Qtリソースの詳細を知りたい場合は、Qtの公式ドキュメントを参照すること。
# Qt 5
qt_add_resources(<VAR> file1.qrc file2.qrc ...
[OPTIONS ...])
# Qt 6
qt_add_resources(<TARGET> <RESOURCE_NAME>
[PREFIX <PATH>]
[LANG <LANGUAGE>]
[BASE <PATH>]
[BIG_RESOURCES]
[OUTPUT_TARGETS <VARIABLE_NAME>]
[FILES ...] [OPTIONS ...]
)
# Qt 6 (バージョンレスコマンドが無効になっている場合)
qt6_add_resources(<TARGET> <RESOURCE_NAME>
[PREFIX <PATH>]
[LANG <LANGUAGE>]
[BASE <PATH>]
[BIG_RESOURCES]
[OUTPUT_TARGETS <VARIABLE_NAME>]
[FILES ...] [OPTIONS ...]
)
# 使用例
# .qrcファイルを使用した変数を使用する場合
set(SOURCES main.cpp)
qt_add_resources(SOURCES
example.qrc
)
qt_add_executable(<プロジェクト名>
${SOURCES}
)
# 即時リソースを使用してターゲット名を指定する場合
qt_add_executable(<プロジェクト名>
main.cpp
)
qt_add_resources(<プロジェクト名> "images"
PREFIX "/images"
FILES image1.png image2.png
)
- ターゲット名を指定する場合のバリアントの引数
- <PREFIX>
- このリソースの全てのファイルが、C++ソースコードからアクセスできるようにするためのパス接頭辞を指定する。
- これは、.qrcファイル形式のXML属性プレフィックスに対応する。
- <PREFIX>を指定しない場合、ターゲットプロパティQT_RESOURCE_PREFIXが使用される。
- Qt 6.5以降、PREFIXはオプションである。
- もし、PREFIXが省略されて、かつ、QT_RESOURCE_PREFIXで指定しない場合は、"/"がデフォルトのパス接頭辞として使用される。
- <LANG>
- このリソースのロケールを指定する。
- これは、.qrcファイル形式のXML属性langに対応する。
- <BASE>
- ファイルのエイリアスのルートポイントを示すパスプレフィックスである。
- 例えば、<BASE>が"assets"、<FILES>が"assets/images/logo.png"の場合、そのファイルのエイリアスは、"images/logo.png"となる。
- ファイルのエイリアス設定は、<QT_RESOURCE_ALIAS>ソースファイルプロパティで設定する必要がある。
- BIG_RESOURCES
- ビッグリソースのサポートを有効にできる。
- これは、C++ソースコードの代わりにオブジェクト・ファイル (.o .obj) を直接生成する。
- これにより、生成されたC++ソースをコンパイルすることなく、より大きなリソースを埋め込むことができる。
- <BIG_RESOURCES>は、CMakeのXcodeプロジェクトジェネレータの制限によりiOSと互換性が無いことに注意する。
- また、<BIG_RESOURCES>は、CMake 3.17以降でのみ動作する。
- 静的ライブラリでこのコマンドを使用する場合、1つ以上の特別なターゲットが生成される。
- これらのターゲットに対して追加の処理を行う場合は、<OUTPUT_TARGETS>パラメータに変数名を渡す。
- qt_add_resourcesコマンドは、特殊ターゲットの名前を指定された変数に格納する。
- <PREFIX>
バージョンレスコマンド
Qt 5.15以降、Qtモジュールはバージョンレスのコマンドも提供している。
例えば、Qt5とQt6のどちらを使用していても、qt_add_translation
コマンドを使用して、翻訳ファイルをコンパイルすることができる。
最初のfind_package
コマンドの実行の前に、QT_NO_CREATE_VERSIONLESS_FUNCTIONS
を設定して、バージョンレスコマンドの作成を防ぐ。
QT_NO_CREATE_VERSIONLESS_FUNCTIONS
- qt_で始まるコマンドを非表示にして、qt6_で始まるバージョン管理されたコマンドのみを残す。
このマクロを定義することで、Qtのバージョン付きのシンボルのみが使用されるようになる。
これは、特にQtの異なるバージョンを混在させる場合や明示的にバージョン管理を行う場合に有用である。
以下の例では、find_package
コマンドの前にset
コマンドでQT_NO_CREATE_VERSIONLESS_FUNCTIONS
をTRUE
に設定している。
これにより、Qtのバージョンなしのシンボルが生成されないようになる。
CMake 3.16以降が必要な場合があるため、cmake_minimum_required
コマンドを適切に設定する必要がある。
cmake_minimum_required(VERSION 3.16)
# Set QT_NO_CREATE_VERSIONLESS_FUNCTIONS before calling find_package
set(QT_NO_CREATE_VERSIONLESS_FUNCTIONS TRUE)
project(MyQtProject)
# 使用するQtライブラリ
find_package(Qt6 REQUIRED COMPONENTS Core Widgets)
# 実行ファイルのソースファイルおよびヘッダファイル
add_executable(MyApp main.cpp)
# Qtライブラリのリンク
target_link_libraries(MyApp Qt6::Core Qt6::Widgets)
バージョンレスターゲット
既存のインポートターゲットに加えて、Qt 5.15以降ではバージョンレスターゲットが使用できる。
例えば、Qt Coreライブラリとリンクする場合、Qt6::CoreとQt::Coreの両方を参照することができる。
バージョンレスターゲットはデフォルトで定義されている。
バージョンレスターゲットを無効にする場合は、最初のfind_package
コマンドの実行前に、QT_NO_CREATE_VERSIONLESS_TARGETS
を設定する必要がある。
QT_NO_CREATE_VERSIONLESS_TARGETS
- Qt::で始まるインポートされたターゲットを隠す。
- 代わりに、Qt6::で始まるターゲットを使用する必要がある。
※注意
例えば、インポートされたQt::Coreターゲットには、Qt6::Coreターゲットで利用可能なターゲットプロパティは無いことに注意する。
以下の例では、まず、Qt6ライブラリを探索する。
探索に失敗した場合は、Qt 5.15ライブラリを探索する。
これにより、Qt 5 / 6に関係なく、インポートされたQt::Coreターゲットを使用することができる。
find_package(Qt6 COMPONENTS Core)
if (NOT Qt6_FOUND)
find_package(Qt5 5.15 REQUIRED COMPONENTS Core)
endif()
add_executable(myApp
# ...略
)
target_link_libraries(myApp PRIVATE Qt::Core)