64

CMake プロジェクトの開始時に、変数 CMAKE_CXX_FLAGS に一般的なコンパイル フラグを設定しています。

set(CMAKE_CXX_FLAGS "-W -Wall ${CMAKE_CXX_FLAGS}")

後で、追加の構成固有のコンパイル フラグ (BUILD_FLAGS に格納されている) を追加する必要があります。これには次のコマンドを使用できますか。

set_target_properties(${TARGET} PROPERTIES COMPILE_FLAGS ${BUILD_FLAGS})

または、手動で CMAKE_CXX_FLAGS を追加する必要がありますか:

set_target_properties(${TARGET} PROPERTIES COMPILE_FLAGS "${CMAKE_CXX_FLAGS} ${BUILD_FLAGS}")

CMAKE_CXX_FLAGS が BUILD_FLAGS によってオーバーライドされるのを防ぐには?

4

2 に答える 2

61

受け入れられた回答はまだ機能していますが、2013 年以降は古くなっています。
この回答は、CMake v2.8.12、v3.3、および v3.13 の新しい機能に基づいています。

CMake-2.8.12 (2013) 以降

設定する 2 つの新しいコマンドCMAKE_CXX_FLAGS:

cmake-2.8.12以降、最後のバージョンのドキュメントはあまり変更されていません。

あなたの場合、次を使用できます:

target_compile_options(${TARGET} PRIVATE ${BUILD_FLAGS})

または、単一のターゲットがある場合:

add_compile_options(${BUILD_FLAGS})

その他の例

target_compile_options(mylib PRIVATE   -O2) # only internal
target_compile_options(mylib INTERFACE -gl) # only external
target_compile_options(mylib PUBLIC    -g)  # same as PRIVATE + INTERFACE

# multiple targets and flags
target_compile_options(mylib1 mylib2 PRIVATE -Wall -Wextra)

target_compile_options(    mylib PUBLIC -DUSEXX)  # Bad
target_compile_definitions(mylib PUBLIC -DUSEXX)  # OK

add_compile_options(-Wall -Wextra) # for all targets in current directory
add_compile_options(-DUSEXX)       # Bad
add_definitions(-DUSEXX)           # OK

非推奨COMPILE_FLAGS

cmake-3.0ドキュメントCOMPILE_FLAGSは非推奨としてフラグ

COMPILE_FLAGS

このターゲットのソースをコンパイルするときに使用する追加のフラグ。

このCOMPILE_FLAGSプロパティは、ターゲット内でソースをビルドするために使用される追加のコンパイラ フラグを設定します。COMPILE_DEFINITIONS追加のプリプロセッサ定義を渡すために使用します。

このプロパティは非推奨です。代わりにCOMPILE_OPTIONSプロパティまたは コマンドを使用してください。target_compile_options

それでも使用したいset_target_properties()場合は、COMPILE_OPTIONS代わりに使用できますCOMPILE_FLAGS

set_target_properties(${TARGET} PROPERTIES COMPILE_OPTIONS ${BUILD_FLAGS})

CMake-3.3 (2015) 以降

Anton Petrovは、 ar31の回答に示されているように、ジェネレータ式を使用することを提案しています。

CMakeジェネレーター式は、以下に適用されます${BUILD_FLAGS}

  • C++ 言語を使用( 、...$<COMPILE_LANGUAGE:CXX>も可能)CCUDA
  • Clang コンパイラを使用$<CXX_COMPILER_ID:Clang>
    (またはVisual C++ の場合もあります... 完全なリストを参照GNU) (言語 がC の場合は代わりに使用)gccMSVC
    $<C_COMPILER_ID:Clang>
  • サポートされている C++ 機能またはコンパイラのバージョンなど ... (ドキュメントを参照)

あなたの場合、次を使用できます:

target_compile_options(${TARGET} PRIVATE
          $<$<COMPILE_LANGUAGE:CXX>:${BUILD_FLAGS_FOR_CXX}>
          $<$<COMPILE_LANGUAGE:C>:${BUILD_FLAGS_FOR_C}>)

またはコンパイラについて:

target_compile_options(${TARGET} PRIVATE
          $<$<CXX_COMPILER_ID:Clang>:${BUILD_FLAGS_FOR_CLANG}>
          $<$<CXX_COMPILER_ID:GNU>:${BUILD_FLAGS_FOR_GCC}>
          $<$<CXX_COMPILER_ID:MSVC>:${BUILD_FLAGS_FOR_VISUAL}>)

CMake-3.13 (2018) 以降

Craig Scottが述べたように、新しい関数target_link_options()を使用すると、リンカーにオプションを渡すことができます。

C および C++ ファイルの異なるオプション

最善の方法は、2 つの異なるターゲットを使用して C ファイルと C++ ファイルを区別することです。

于 2015-06-26T14:20:59.737 に答える
59

最初のものを使用します:

set_target_properties(${TARGET} PROPERTIES COMPILE_FLAGS ${BUILD_FLAGS})

BUILD_FLAGS に格納されているフラグは、TARGET のソースをコンパイルするときに CMAKE_CXX_FLAGS の後に追加されます。ドキュメントはこれを示唆していますが、確認するために試してみました。

COMPILE_FLAGS

   Additional flags to use when compiling this target's sources. 
   
   The COMPILE_FLAGS property sets additional compiler flags used to
   build sources within the target.  Use COMPILE_DEFINITIONS to
   pass additional preprocessor definitions.

完全なコマンド ラインは次のようになります。

${CMAKE_CXX_COMPILER} ${CMAKE_CXX_FLAGS} ${COMPILE_FLAGS} -o foo.o -c foo.cc

ラモンが言ったように、いつでも確認できますmake VERBOSE=1

于 2011-02-24T07:18:00.283 に答える