CMakeでのデバッグとリリース


434

GCCコンパイル済みプロジェクトでは、

  • 各ターゲットタイプ(デバッグ/リリース)に対してCMakeを実行するにはどうすればよいですか?
  • CMakeを使用してデバッグとリリースのC / C ++フラグを指定するにはどうすればよいですか?
  • メインの実行可能ファイルがコンパイルされg++、1つのネストされたライブラリがコンパイルされることをどのように表現しgccますか?

回答:


656

CMakeでは、通常、「ソース外」ビルドを行うことをお勧めします。CMakeLists.txtプロジェクトのルートにを作成します。次に、プロジェクトのルートから:

mkdir Release
cd Release
cmake -DCMAKE_BUILD_TYPE=Release ..
make

そしてDebug(プロジェクトのルートから):

mkdir Debug
cd Debug
cmake -DCMAKE_BUILD_TYPE=Debug ..
make

Release/ Debugはコンパイラに適切なフラグを追加します。ビルド構成もRelWithDebInfoありMinSizeRelます。


フラグを変更/追加するには、変数を追加できるツールチェーンファイルCMAKE_C_FLAGS_DEBUGCMAKE_C_FLAGS_RELEASE変数を指定します。例:

set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wall")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Wall")

詳細については、CMAKE_BUILD_TYPEを参照してください。


3番目の質問については、正確に何を尋ねているのかわかりません。CMakeは、さまざまなソースファイルに適したコンパイラを自動的に検出して使用します。


3
cmake -i ..代わりにa を実行することもできるので、cmakeは対話的に実行され、必要なビルドのタイプ(None、Release、Debug、MinSizeRel、RelWithDebInfo)を尋ねます。
thiagowfx 2016

5
@thiagowfx -iオプションを指定すると、次のエラーメッセージが表示されますThe "cmake -i" wizard mode is no longer supported.。私はcmake 3.7.1を使用しています
PhilippClaßen2017年

3
素晴らしい観察。バージョンから廃止されたよう3.0.0です。リファレンス
thiagowfx 2017年

7
サブディレクトリを作成している場合、これはソース外ビルドではありません!ソースディレクトリの外/上にビルドディレクトリを作成することをお勧めします。
ビクターラモイン2017

CMAKE_BUILD_TYPEが設定されていない場合、cmakeはデフォルトのビルドタイプを選択しないため、生成されたコンパイラコマンドラインはどのビルド構成とも一致しません。
デヴィッド・

22

デバッグ/解放フラグについては、CMAKE_BUILD_TYPE変数を参照してください(それをとして渡しますcmake -DCMAKE_BUILD_TYPE=value)。以下のような値をそれを取るReleaseDebugなど、

https://gitlab.kitware.com/cmake/community/wikis/doc/cmake/Useful-Variables#compilers-and-tools

cmakeは拡張子を使用してコンパイラを選択するため、ファイルに.cという名前を付けるだけです。

これをさまざまな設定で上書きできます。

例えば:

set_source_files_properties(yourfile.c LANGUAGE CXX) 

.cファイルをg ++でコンパイルします。上記のリンクは、C / C ++用の特定のコンパイラを選択する方法も示しています。


15

CMAKE_CXX_FLAGS文字列を直接操作する代わりに(string(APPEND CMAKE_CXX_FLAGS_DEBUG " -g3")btw を使用してより適切に行うことができます)、次のように使用できますadd_compiler_options

add_compile_options(
  "-Wall" "-Wpedantic" "-Wextra" "-fexceptions"
  "$<$<CONFIG:DEBUG>:-O0;-g3;-ggdb>"
)

これにより、指定された警告がすべてのビルドタイプに追加されますが、指定されたデバッグフラグのみがビルドに追加されますDEBUG。コンパイルオプションは、CMakeリストとして格納されます。これは、セミコロンで要素を区切る単なる文字列;です。


2
しませんlist(APPEND CMAKE_CXX_FLAGS_DEBUG "-g3")-g3は、コマンドを終了し、確実に失敗する新しいコマンド-g3を開始する前に、セミコロンを追加しますか?
cburn11

あなたは正しいCMAKE_CXX_FLAGSですない cmakeのリストが、スペースで区切られたコマンドラインフラグの文字列。私はその行動に一貫性がないと思います...
セバスチャン2018

add_compile_options()は素晴らしいです。-fsanitize = addressなどのオプションをリンカーに追加する必要がある場合のために、add_link_options()で補完されます。
Bowie Owens、

1
これは2020 / cmake 3.17でもまだ適切な方法ですか?その最後の行は厄介に見えます
ジェイ


4

// CMakeLists.txt:リリース

set(CMAKE_CONFIGURATION_TYPES "Release" CACHE STRING "" FORCE)

// CMakeLists.txt:デバッグ

set(CMAKE_CONFIGURATION_TYPES "Debug" CACHE STRING "" FORCE)

9
なぜこれが反対票を投じられるのか理解できません。本番で使用されている実際のコードですが、気にしません。
sailfish009 2018

5
多分、CMakeのドキュメントCMAKE_CONFIGURATION_TYPESによると、の可能な値が含まれているためCMAKE_BUILD_TYPEです。したがって、他の回答が示唆するように、後者を設定する必要があります。多分あなたの解決策はあなたが持っているものに可能な選択肢を制限するのでうまくいくでしょう。
bjhend

2
これが機能するため、賛成票を投じます。CMakeは大好きですが、癖があり、動作させるために大きなハンマーを使用する必要がある場合があります。何らかの理由でコマンドラインフラグを拒否するプロジェクトがあります。
cory.todd

ここでの設定は動作しないことが理由のいくつかの追加情報です:stackoverflow.com/a/24470998/3196753は
tresf
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.