web-dev-qa-db-ja.com

#ifdefプラットフォームから独立したCMakeによるデバッグ

Windows(Visual Studio)とLinuxマシン(gcc)でプロジェクトをビルドするためにCMakeを使用しています。のように、一部のコードを「デバッグ専用」としてマークしたい

#ifdef DEBUG
//some logging here
#endif

問題は、CMakeの「Debug」ビルドタイプのすべてのプラットフォームで使用できるコンパイラ定義は何ですか。 DEBUGは存在しないようです。 (ビルドの種類がデバッグの場合にのみ、ログなどを取得したいと思います。)

30
Philipp

CMakeは、デフォルトで-DNDEBUGをCMAKE_C_FLAGS_ {RELEASE、MINSIZEREL}に追加します。したがって、#ifndef NDEBUGを使用できます。

87
arrowd

独自の定義を追加することをお勧めします。 CMake記号CMAKE_C_FLAGS_DEBUGには、デバッグモードでのみ使用されるフラグを含めることができます。例えば:

C

set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -DMY_DEBUG")

C++

set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DMY_DEBUG")

コードで次のように記述できます。

#ifdef MY_DEBUG
// ...
#endif

(たぶん、あなたは"/DMY_DEBUG"(ビジュアルスタジオ用)。

23
Lindydancer

CMake> = 2.8では、 target_compile_definitions を使用します:

target_compile_definitions(MyTarget PUBLIC "$<$<CONFIG:DEBUG>:DEBUG>")

デバッグモードでコンパイルすると、コードで使用するDEBUGシンボルが定義されます。これは、Visual StudioやXcodeなどのIDEでも機能します。cmakeは、すべてのコンパイルモードで単一のファイルを生成します。

ターゲットごとにこれを行う必要があります[1]。または、 add_compile_options (Cmake> = 3.0)を使用することもできます。

add_compile_options("$<$<CONFIG:DEBUG>:-DDEBUG>")

Visual C++の最近のバージョン(少なくともVS2015以降)では、パラメーターに/または-を使用できるため、コンパイラー全体で正常に機能することに注意してください。このコマンドは、追加したい他のコンパイルオプションにも役立ちます(MSVCのリリースモードでは「/ O2」、G ++/Clangのリリースモードでは「-O3」)。

[1]:注:CMake> = 3.12(現在ベータ版)には、ジェネレータ式をサポートするadd_compile_definitionsもあり、これはすべてのターゲットに影響します。

8
jtbr