「Qtの設定 - CMake」の版間の差分

ナビゲーションに移動 検索に移動
23行目: 23行目:


== 非推奨のコマンドおよび設定 ==
== 非推奨のコマンドおよび設定 ==
==== 非推奨のコマンド ====
* include_directoriesコマンド
* include_directories
*: 指定したディレクトリからヘッダファイルを検索するコマンドである。
*: 指定したディレクトリからヘッダファイルを検索するコマンドである。
*: 定義した箇所以降の全てのターゲットが指定したディレクトリをインクルードするため、使用は避けるべきである。
*: 定義した箇所以降の全てのターゲットが指定したディレクトリをインクルードするため、使用は避けるべきである。
* add_definitions
<br>
* add_compile_definitions
* add_definitionsコマンド
* add_compile_options
<br>
* link_directories
* add_compile_definitionsコマンド
* link_libraries
<br>
* add_compile_optionsコマンド
<br>
* link_directoriesコマンド
<br>
* link_librariesコマンド
<br>
* キャッシュ変数には、必ず接頭辞を付加する
*: キャッシュ変数はグローバル変数であるため、名前の衝突を避けるために接頭辞を付加する。
<br>
* 変数CMAKE_<LANG>_FLAGS
*: 代わりに、<code>target_compile_options</code>を使用する。
*: <code>target_compile_options(<ターゲット名> PUBLIC -Wall)</code>
<br>
* 変数<code>CMAKE_CXX_FLAGS</code>や<code>target_compile_options</code>コマンドに、<code>-std=c++17</code>等を指定しない。
*: 変数<code>CMAKE_CXX_STANDARD</code>を使用する(CMake 3.1以降)、または、<code>target_compile_features</code>コマンドに<code>cxx_std_17</code>を指定する。(CMake 3.8以降)
<br>
* 変数CMAKE_SOURCE_DIRを使用しない
*: 変数<code>CMAKE_SOURCE_DIR</code>は、トップレベルのディレクトリを指す。
*: 異なるプロジェクトがネストしている場合、自身のプロジェクトのルートディレクトリ以外のパスを指すため、使用すべきでない。
*: 代わりに、変数<code>CMAKE_CURRENT_SOURCE_DIR</code>、変数<code>PROJECT_SOURCE_DIR</code>、変数<code><プロジェクト名>_SOURCE_DIR</code>を使用する。
<br>
* macroコマンドの代わりにfunctionコマンドを使用する
*: <code>function</code>コマンドは、関数を定義するためのコマンドである。
*: <code>macro</code>コマンドは、呼び出す側のスコープにある変数を上書きするため、自身のスコープを持つ<code>function</code>コマンドを使用する。
*: 親ディレクトリのスコープにある変数を上書きする場合は、<code>set(<変数名> <値> ... PARENT_SCOPE)</code>コマンドを使用する。
<br>
* file(GLOB)コマンド
*: <code>file(GLOB)</code>コマンドは、CMakeを実行するたびに条件に合致するファイルのリストを自動的に作成するコマンドである。
*: ただし、特定のIDEでは正常に動作しない可能性があるため、コマンドラインから実行するような場合ではない限り使用すべきではない。
*: IDEで使用する場合は、CMakeLists.txtファイルに<code>add_subdirectory</code>コマンドと<code>target_sources</code>コマンドを使用して、再帰的にファイルを明示して追加する。
<syntaxhighlight lang="cmake">
# CMakeLists.txtファイル
add_executable(<ターゲット名>)
add_subdirectory(<ディレクトリ名1>)
add_subdirectory(<ディレクトリ名2>)
# 同様に子ディレクトリを追加する
</syntaxhighlight>
<br>
<syntaxhighlight lang="cmake">
# <ディレクトリ名1>/CMakeLists.txtファイル
# CMake 3.12以前
target_sources(<ターゲット名> PRIVATE
    ${CMAKE_CURRENT_SOURCE_DIR}/file1.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/file2.cpp
    # 絶対パスで指定しないとエラーになるため注意すること
)
# CMake 3.13以降
cmake_policy(SET CMP0076 NEW)  # CMakeが自動的に相対パスを絶対パスへ変換する
target_sources(<ターゲット名> PRIVATE
    file1.cpp
    file2.cpp
)
</syntaxhighlight>
<br>
* <code>PRIVATE</code>オプション、<code>PUBLIC</code>オプション、<code>INTERFACE</code>オプションを適切に使用する。
*: これらのオプションは、コマンドのターゲットおよびそのターゲットに依存するターゲットに対する必要性を表す。
*: ヘッダファイルのみのライブラリの場合は、<code>INTERFACE</code>オプションを使用する。
<center>
{| class="wikitable" | style="background-color:#fefefe;text-align: center;"
|-
! style="background-color:#66CCFF;" | オプション
! style="background-color:#66CCFF;" | ターゲットが必要とする
! style="background-color:#66CCFF;" | ターゲットに依存するターゲットが必要とする
|-
| PRIVATE || ○ || ☓
|-
| PUBLIC || ○ || ○
|-
| INTERFACE || ☓ || ○
|}
</center>
<br>
* ライブラリの種類を指定しない
*: ビルドするユーザがスタティックライブラリまたはダイナミックライブラリを指定できるようにする。
*: <code>BUILD_SHARED_LIBS</code>オプションを付加して選択することもできるが、各ライブラリごとにオプションを設定すべきである。
<syntaxhighlight lang="cmake">
option(<変数名1> "build library as a shared library" ON)
if(<変数名1>)
    add_library(<ターゲット名> SHARED)
else()
    add_library(<ターゲット名> STATIC)
endif()
</syntaxhighlight>
<br><br>
<br><br>


案内メニュー