「CMake - Qtコマンド」の版間の差分

提供:MochiuWiki : SUSE, EC, PCB
ナビゲーションに移動 検索に移動
タグ: 差し戻し済み
タグ: 差し戻し済み
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)


Qt6 CoreのCMakeコマンド
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コマンドは、特殊ターゲットの名前を指定された変数に格納する。



バージョンレスコマンド

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_FUNCTIONSTRUEに設定している。
これにより、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)