web-dev-qa-db-ja.com

add_compile_optionsとSET(CMAKE_CXX_FLAGS ...)の違い

この質問は リンクを駆動するときにCXXとCXXFLAGSを使用するようにCmakeに指示しますか? 前の質問では、リンカーを呼び出すときにCXXFLAGSを使用するようにCMakeに指示しようとしています。

add_compile_options

次のコードが見つかりました

if (CMAKE_VERSION VERSION_LESS 2.8.12)
    add_definitions(-foo)
else()
    add_compile_options(-foo)
endif()

message(STATUS, "CXXFLAGS: ${CMAKE_CXX_FLAGS}")

出力を生成します

CXXFLAGS:

SET CMAKE_CXX_FLAGS

次のコードが見つかりました

SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -foo" )

message(STATUS, "CXXFLAGS: ${CMAKE_CXX_FLAGS}")

出力を生成します

CXXFLAGS: -foo

質問

どちらの場合でも、CMakeは-fooを使用してオブジェクトファイルを作成します。したがって、-fooは間違いなくCXXFLAGSに移行しています。

CMakeコードの最初のセットとCMakeコードの2番目のセットの違いは何ですか?

あるインスタンスでCMAKE_CXX_FLAGSが設定解除され、他のインスタンスで設定されるのはなぜですか?

22
jww
  • _CMAKE_CXX_FLAGS_は、すべてのC++ターゲットにフラグを追加するために使用されます。これは、警告レベルなどの一般的な引数を渡すか、選択した必要なC++標準に渡すのに便利です。 CまたはFortranターゲットには影響せず、ユーザーは追加のフラグを渡す場合があります。

  • _add_compile_options_は、ディレクトリおよびそのサブディレクトリ内のすべてのターゲットにオプションを追加します。これは、ディレクトリにライブラリがあり、ライブラリに関連するすべてのターゲットにオプションを追加したいが、他のすべてのターゲットとは関係がない場合に便利です。さらに、_add_compile_options_は生成式で引数を処理できます。 documentation は明示的に述べている、

このコマンドを使用してオプションを追加できますが、プリプロセッサ定義を追加する(target_compile_definitions()およびadd_definitions())またはディレクトリを含める(target_include_directories()およびinclude_directories())。

  • _add_definitions_は、プリプロセッサ変数を定義および設定するタイプ_-DFOO -DBAR=32_(Windowsでは_/D_)のプリプロセッサ値を渡すことを目的としています。任意のフラグを渡すことができますが、上記の形式のフラグが検出され、_[COMPILE_DEFINITIONS][2]_プロパティに追加されます。これは後で読み取りおよび変更できます。ここでは、ジェネレータ式も使用できます。 documentation は、ディレクトリ、ターゲット、およびソースファイルのスコープに言及しています。

特定のターゲットについて、CMakeは_CMAKE_CXX_FLAGS_、ターゲットとディレクトリの_COMPILE_DEFINITIONS_、およびターゲットに影響するすべての_add_compile_options_からすべてのフラグを収集します。
_CMAKE_CXX_FLAGS_は、他のコマンドによって変更されることはなく、その逆も同様です。これは、これらのコマンドの範囲に違反します。

26
usr1234567