受け入れられた回答はまだ機能していますが、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>
も可能)C
CUDA
- Clang コンパイラを使用
$<CXX_COMPILER_ID:Clang>
(またはVisual C++ の場合もあります... 完全なリストを参照GNU
) (言語
がC の場合は代わりに使用)gcc
MSVC
$<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++ ファイルを区別することです。