CMakeを通じてプリプロセッサマクロを定義しますか?


283

CMakeを介してプリプロセッサ変数を定義するにはどうすればよいですか?

同等のコードはになります#define foo

回答:


382

長い間、CMakeはadd_definitionsこの目的のためのコマンドを持っていました。ただし、最近このコマンドは、よりきめの細かいアプローチ(コンパイル定義、インクルードディレクトリ、コンパイラオプション用の個別のコマンド)に置き換えられました。

新しいadd_compile_definitionsを使用した例:

add_compile_definitions(OPENCV_VERSION=${OpenCV_VERSION})
add_compile_definitions(WITH_OPENCV2)

または:

add_compile_definitions(OPENCV_VERSION=${OpenCV_VERSION} WITH_OPENCV2)

これについての良い部分は、それがCMakeが用意している粗末な策略を回避することですadd_definitions。CMakeはそのような粗末なシステムですが、彼らはついに正気を見つけ始めています。

コンパイラフラグに使用するコマンドの詳細については、https//cmake.org/cmake/help/latest/command/add_definitions.htmlをご覧ください。

同様に、ジムハンジカーの回答で説明されているように、ターゲットごとにこれを行うことができます。


4
リンクされたページから:「注このコマンドは代替手段に取って代わられました:プリプロセッサー定義を追加するにはadd_compile_definitions()を使用してください。」たぶんこの答えは編集が必要ですか?
M.Herzkamp 2018

9
cmake 3.10.2では、をadd_compile_definitionsスローしCMake Error at CMakeLists.txt:6 (add_compile_definitions): Unknown CMake command "add_compile_definitions".ます。add_compile_options(-D <your-def>)代わりに使用する必要がありました。
code_dredd 2018

2
@mannyglover私はそうは思いませんが、-Dを使用してコンパイラフラグを設定できますcmake -D CMAKE_CXXFLAGS='-DDEBUG_CHESSBOARD'(テストされていません)
ypnos 2018年

1
それは本当に新しい...実際にはそれはもっとモダンなCMake(> 3.11)にあります。コマンドがいつ導入されたかを知るのがとても難しい痛み。
Sandburg、

1
@Sandburg最後のドキュメントへのリンクを開いてhttps://cmake.org/cmake/help/v3.17/command/add_compile_definitions.html#command:add_compile_definitions、ページが消えるまでバージョン番号を変更していきます。それはまだ存在しないバージョンです。次の移動では、Whats newセクションに移動して、新しいコマンドまたは機能を見つけることができます。だからそれほど難しくはありません。
アンドリー

245

特定のターゲットに対してこれを行うには、以下を実行できます。

target_compile_definitions(my_target PRIVATE FOO=1 BAR=1)

ビルドしているターゲットが複数あり、それらすべてに同じフラグを使用させたくない場合は、これを行う必要があります。target_compile_definitionsの公式ドキュメントも参照してください。


1
@JimHunzikerどうtarget_compile_definitions(my_target PRIVATE FOO=1)違うのset_source_files_properties(foo.cpp PROPERTIES COMPILE_DEFINITIONS -DFOO=1)
John Strood

1
@JohnStrood違いはスコープレベルです。target_compile_definitionsWHOLE実行可能ファイル/ライブラリの値を設定します。'set_source_files_properties`は指定されたファイルのみの値を設定します。Latterコマンドでは、ファイルを別の言語を使用してコンパイルできます。すなわち:set_source_files_properties(compile_me_as_objc.c PROPERTIES -x objective-c。これ-x objective-cはGCC / Clangに固有のフラグであることに注意してください。
ジュリアンキルシュ

20

このページで提案されている他のソリューションは、Cmake <のいくつかのバージョンで役立ち3.3.2ます。ここで私が使用しているバージョン(つまり、3.3.2)のソリューション。を使用してCmakeのバージョンを確認$ cmake --versionし、ニーズに合ったソリューションを選択します。cmakeのドキュメントは、公式ページにあります。

CMakeバージョン3.3.2では、

#define foo

私は使用する必要がありました:

add_definitions(-Dfoo)   # <--------HERE THE NEW CMAKE LINE inside CMakeLists.txt
add_executable( ....)
target_link_libraries(....)

そして、次のようなプリプロセッサマクロ定義を作成するには:

#define foo=5

行はそのように変更されています:

add_definitions(-Dfoo=5)   # <--------HERE THE NEW CMAKE LINE inside CMakeLists.txt
add_executable( ....)
target_link_libraries(....)

4
ごとのドキュメント、このソリューションは、実際に古い、より時代遅れのアプローチです。他の答えは、より近代的なソリューションを提供します。
squareskittles

2
答えを書いたとき、私は他の解決策を試しましたが、どれもうまくいきませんでした。
Leos313

@squareskittles、他の答えのソリューションが正しく機能しなかった理由は何ですか?CMakeを試してみるとエラーになる
Leos313

1
CMake 3.3.2を使用している場合は、回答で示したように、add_definitions()またはを使用する必要がありtarget_compile_definitions()ます。より新しいコマンドはadd_compile_definitions()、CMake 3.12まで追加されませんでした。@ Leos313
squareskittles

1
@squareskittles、私は答えを更新して、私がいくつかのmountssで以前書いたものを書き直しています。この指摘をありがとう
Leos313
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.