web-dev-qa-db-ja.com

cmakeによるプリプロセッサマクロの定義

Cmakeを使ってプリプロセッサ変数を定義する方法を教えてください。

同等のコードは#define fooです。

235
Mythli

長い間、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

同様に、Jim Hunzikerの答えで説明されているように、ターゲットごとにこれを行うことができます。

340
ypnos

特定のターゲットに対してこれを行うには、次のようにします。

target_compile_definitions(my_target PRIVATE FOO=1 BAR=1)

あなたが構築しているターゲットが複数あり、それらすべてに同じフラグを使用させたくない場合は、これを行うべきです。 target_compile_definitions に関する公式文書も参照してください。

207
Jim Hunziker

このページで提案されている他の解決策は有用ですCmakeの古いバージョンのために。これが新しいバージョンの解決策です。 $ cmake --versionを使用してCmakeのバージョンを確認し、ニーズに合ったソリューションを選択してください。 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(....)
9
Leos313