いくつかの方法を簡単に説明します
CMake は、開発者がすべてのプラットフォームのビルド プロセスを記述する単純なファイルを作成できるクロスプラットフォーム ビルド システムです。CMake では、次の方法でコンパイル パラメーターと前処理ディレクティブを追加できます。
-
コンパイルパラメータを追加します。
-
コマンドを使用します
add_compile_options
。このコマンドはすべてのターゲットに追加されます。例えば:add_compile_options(-Wall)
-
コマンドを使用します
target_compile_options
。このコマンドは、指定されたターゲットにのみ追加されます。例えば:target_compile_options(target PRIVATE -Wall)
-
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ...")
は、コンパイル パラメータを追加するもう 1 つの一般的な方法です。このアプローチは CMake のグローバル変数を直接変更するため、すべてのターゲットに影響します。たとえば、
-Wall
コンパイル オプションを追加したい場合は、次のように記述できます。set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall")
このコード行は、変数
-Wall
に追加されることを意味します。変数には、C++ コンパイラのコンパイル オプションが含まれています。CMAKE_CXX_FLAGS
CMAKE_CXX_FLAGS
同様に、C コンパイラの場合は、次を使用できます
CMAKE_C_FLAGS
。set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall")
このアプローチの欠点は、特定の 1 つのターゲットだけではなく、すべてのターゲットに影響を与えることです。特定のターゲットにコンパイル オプションを追加するだけの場合は、
target_compile_options
コマンドを使用する必要があります。
-
-
前処理ディレクティブを追加します。
-
コマンドを使用します
add_definitions
。このコマンドはすべてのターゲットに追加されます。例えば:add_definitions(-DDEBUG)
-
コマンドを使用します
target_compile_definitions
。このコマンドは、指定されたターゲットにのみ追加されます。例えば:target_compile_definitions(target PRIVATE DEBUG)
上の 2 つの例では、
DEBUG
これは前処理ディレクティブであり、コンパイル時に定義されます。 -
これらのキーワードの意味に注意してくださいPRIVATE
。PUBLIC
INTERFACE
PRIVATE
: ターゲット自体のみがこれらのコンパイル パラメータを使用します。PUBLIC
: ターゲット自体と、このターゲットに依存する他のターゲットは、これらのコンパイル パラメータを使用します。INTERFACE
: このターゲットに依存する他のターゲットのみがこれらのコンパイル パラメータを使用します。
上記は、CMake でコンパイル パラメーターと前処理命令を追加するすべての方法です。
add_definitions 解析
CMake の公式ドキュメントによると、add_definitions
このコマンドはソース ファイルのコンパイルに -D 定義フラグを追加するために使用されます。このコマンドは任意のフラグを追加するために使用できますが、主にプリプロセッサ定義を追加するために使用されます。
たとえば、add_definitions(-DFOO -DBAR ...)
現在のディレクトリ内のターゲットのコンパイラ コマンド ラインに定義が追加されます。このコマンドがターゲットの追加前または追加後に呼び出されたかどうかに関係なく、サブディレクトリ内のターゲットはこのコマンドの呼び出し後に追加されます。
ただし、このコマンドは次の代替コマンドに置き換えられました。
- プリプロセッサ定義を追加するために使用します
add_compile_definitions()
。 - インクルードディレクトリを追加するために使用します
include_directories()
。 - 追加のオプションを追加するために使用します
add_compile_options()
。
-D または /D で始まるフラグ (プリプロセッサ定義のように見える) は、現在のディレクトリの COMPILE_DEFINITIONS ディレクトリ プロパティに自動的に追加されます。重要な値を含む定義は、下位互換性の理由から、変換されずにフラグ セットに残る場合があります。
したがって、このコマンドを使用してコンパイラ フラグを追加できることは正しいですadd_definitions
が、それは主な用途ではなく、場合によっては問題を引き起こす可能性があります。-Wall や -g などのコンパイラ フラグの場合は、add_compile_options()
このコマンドの方が推奨されます。
add_compile_options 解析
add_compile_options
コマンドは、ソース ファイルのコンパイルにオプションを追加するために使用されます。これらのオプションは COMPILE_OPTIONS ディレクトリ プロパティに追加され、現在のディレクトリとそのサブディレクトリ内のターゲットをコンパイルするときに使用されます。これらのオプションはリンク時には使用されず、リンク時にadd_link_options()
コマンドを使用してオプションを追加する必要があることに注意してください。
add_compile_options
コマンドのパラメータにはジェネレータ式を使用でき、ターゲットの最終オプション セットは、現在のターゲットとその依存関係の使用要件からオプションを蓄積することによって構築されます。オプション セットは重複を避けるために重複排除されます。
たとえば、特定のコンパイラ条件下でこのコマンドを使用できます。
if (MSVC)
# warning level 4
add_compile_options(/W4)
else()
# additional warnings
add_compile_options(-Wall -Wextra -Wpedantic)
endif()
特定のターゲットにコンパイル オプションを追加する場合は、target_compile_options
コマンドを使用する必要があります。たとえば、 というターゲットがある場合my_target
、次のようにコンパイル オプションを追加できます。
target_compile_options(my_target PRIVATE -Wall -Wextra -Wpedantic)
この例では、これらのコンパイル オプションはこのターゲット-Wall -Wextra -Wpedantic
にのみ追加され、他のターゲットには影響しません。my_target
さまざまな用途の違い
CMAKE_<LANG>_FLAGS
すべての構成時ビルド言語で使用されるグローバル フラグです。これらのフラグは、コンパイルを駆動するものやリンクを駆動するものを含む、コンパイラーのすべての呼び出しに渡されます。
この変数が定義されていない場合、言語ごとに環境変数と CMake のツールチェーンの組み込みのデフォルトで初期化され、キャッシュに保存されます。たとえば、CMAKE_CXX_FLAGS
CXXFLAGS 環境変数によって初期化されます。
この値はコマンド ライン文字列の一部であるため、複数のオプションはスペースで区切る必要があり、スペースを含むオプションは引用符で囲む必要があります。
この変数のフラグは、設定された各変数CMAKE_<LANG>_FLAGS_<CONFIG>
のフラグの前に渡されます。これら 2 つの変数のフラグは、ドライバーのコンパイルの呼び出しでadd_compile_options()
およびetc. コマンドtarget_compile_options()
によって追加されるフラグの前に渡されます。これらは、ドライバー リンクの呼び出し時にadd_link_options()
およびetc コマンドtarget_link_options()
によって追加されるフラグの前に渡されます。
したがって、add_compile_options
と の両方set(CMAKE_CXX_FLAGS ...)
をコンパイル オプションの追加に使用できますが、使用シナリオと影響範囲が異なります。add_compile_options
より柔軟なオプションは特定の条件下で追加できますが、set(CMAKE_CXX_FLAGS ...)
グローバル設定はすべてのターゲットに影響します。これら 2 つのコマンドは同時に使用でき、その効果は累積され、相互にオーバーライドされません。
エピローグ
理解することは、プログラミング学習の次のレベルへの重要なステップです。ただし、新しいスキルやアイデアを習得するには、常に時間と粘り強さが必要です。心理学の観点から見ると、学習には継続的な試行錯誤と調整が伴うことが多く、これは私たちの脳が問題を解決するための「アルゴリズム」を徐々に最適化していくのと似ています。
だからこそ、間違いに遭遇したときは、それを単なる強迫観念ではなく、学び改善する機会として捉える必要があります。これらの問題を理解して解決することで、現在のコードを修正できるだけでなく、プログラミング能力を向上させ、将来のプロジェクトで同じ間違いが起こるのを防ぐことができます。
皆さんも積極的に参加し、プログラミング スキルを継続的に向上させることをお勧めします。あなたが初心者であろうと経験豊富な開発者であろうと、私のブログがあなたの学習の旅に役立つことを願っています。この記事が役立つと思われる場合は、クリックしてブックマークするか、コメントを残して洞察や経験を共有してください。また、私のブログの内容について提案や質問をすることも歓迎します。「いいね!」、コメント、シェア、フォローのすべてが私にとって最大のサポートであり、共有し、創作を続けるモチベーションとなっています。
私の CSDN ホームページを読んで、よりエキサイティングなコンテンツのロックを解除してください: Bubble の CSDN ホームページ