「CMake - Qt5 / Qt6の互換性」の版間の差分

ナビゲーションに移動 検索に移動
(ページの作成:「== 概要 == Qt 5およびQt 6のCMakeコマンドのセマンティクスは、ほぼ互換性がある。<br> しかし、Qt 5.14以前では、インポートされたQtライブラリのターゲットとコマンドは、全て名前の一部としてバージョン番号を含んでいた。<br> <br> そのため、Qt 5とQt 6の両方で動作するCMakeコマンドを記述することは煩雑であった。<br> <br> Qt 5.15以降では、バージョンレ…」)
 
124行目: 124行目:
同様に、インポートするQtライブラリ名も指定することができる。<br>
同様に、インポートするQtライブラリ名も指定することができる。<br>
<code>target_link_libraries</code>コマンドにQt${QT_VERSION_MAJOR}::Widgetsと記述することにより、Qt5::WidgetsまたはQt6::Widgetsのいずれかのライブラリをリンクすることができる。<br>
<code>target_link_libraries</code>コマンドにQt${QT_VERSION_MAJOR}::Widgetsと記述することにより、Qt5::WidgetsまたはQt6::Widgetsのいずれかのライブラリをリンクすることができる。<br>
<br><br>
== 推奨事項 ==
* 可能であれば、CMakeコマンドのバージョンレスバリアントを使用する。
* 同じプロジェクトでQt 5およびQt 6をサポートする必要がある場合を除き、バージョン付きのターゲットを使用する。
* バージョンレスターゲットを使用しなければならない場合は、[[CMake_-_Qt5_/_Qt6の互換性#バージョンレスターゲットのデメリット|バージョンレスターゲットを使用する際のデメリット]]に注意する。
* Qt 5.15より古いバージョンのQt 5をサポートする必要がある場合や、<br><code>QT_NO_CREATE_VERSIONLESS_FUNCTIONS</code>や<code>QT_NO_CREATE_VERSIONLESS_TARGETS</code>が定義されているコンテキストでCMakeコードがロードされるかどうかを制御できない場合は、<br>バージョン管理されたバージョンのCMakeコマンドやターゲットを使用する。<br><br>この場合でも、変数を通して実際のコマンド名やターゲット名を決定することにより、コードを簡素化することができる。
<br><br>
== バージョンレスターゲットのデメリット ==
バージョンレスターゲットには、いくつかのデメリットがある。<br>
<br>
バージョンレスターゲットはALIASターゲットであり、バージョン付きターゲットのターゲットプロパティが無い。<br>
<br>
プロジェクトは、バージョンレスターゲットを公開するターゲットをエクスポートしてはならない。<br>
例えば、他のプロジェクトにより消費されるライブラリは、バージョンレスターゲットに対して公にリンクするターゲットをエクスポートしてはならない。<br>
これは、推移的依存関係が壊れたり、そのライブラリのユーザがQt 5とQt 6のターゲットを不本意に混在させたりする可能性がある。<br>
<br><br>
== WindowsのUnicodeサポート ==
Qt 6では、Qtモジュールに対してリンクするターゲットに対して、<code>UNICODE</code>と<code>_UNICODE</code>コンパイラ定義がデフォルトで有効化されている。<br>
これは、qmakeコマンドの動作と同様であるが、Qt 5のCMake APIの動作と差異がある。<br>
<br>
ターゲット上において、<code>qt_disable_unicode_defines</code>コマンドを実行して、<code>UNICODE</code>と<code>_UNICODE</code>コンパイラ定義を無効にする。<br>
<syntaxhighlight lang="cmake">
find_package(Qt6 COMPONENTS Core)
add_executable(myApp
    # ...略
)
qt_disable_unicode_defines(myApp)
</syntaxhighlight>
<br><br>
<br><br>


案内メニュー