[Cmake がコンパイル パラメーターを追加] cmake でコンパイル パラメーターと前処理命令を増やすためのいくつかの方法


いくつかの方法を簡単に説明します

CMake は、開発者がすべてのプラットフォームのビルド プロセスを記述する単純なファイルを作成できるクロスプラットフォーム ビルド システムです。CMake では、次の方法でコンパイル パラメーターと前処理ディレクティブを追加できます。

  1. コンパイルパラメータを追加します。

    • コマンドを使用します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_FLAGSCMAKE_CXX_FLAGS

      同様に、C コンパイラの場合は、次を使用できますCMAKE_C_FLAGS

      set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall")
      

      このアプローチの欠点は、特定の 1 つのターゲットだけではなく、すべてのターゲットに影響を与えることです。特定のターゲットにコンパイル オプションを追加するだけの場合は、target_compile_optionsコマンドを使用する必要があります。

  2. 前処理ディレクティブを追加します。

    • コマンドを使用しますadd_definitionsこのコマンドはすべてのターゲットに追加されます。例えば:

      add_definitions(-DDEBUG)
      
    • コマンドを使用しますtarget_compile_definitionsこのコマンドは、指定されたターゲットにのみ追加されます。例えば:

      target_compile_definitions(target PRIVATE DEBUG)
      

    上の 2 つの例では、DEBUGこれは前処理ディレクティブであり、コンパイル時に定義されます。

これらのキーワードの意味に注意してくださいPRIVATEPUBLICINTERFACE

  • 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_FLAGSCXXFLAGS 環境変数によって初期化されます。

この値はコマンド ライン文字列の一部であるため、複数のオプションはスペースで区切る必要があり、スペースを含むオプションは引用符で囲む必要があります。

この変数のフラグは、設定された各変数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 ホームページ
ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/qq_21438461/article/details/131719466