【C/C++ 開発者必見】CMakeのデバッグビルド設定をマスターしよう! `CMAKE_LANG_FLAGS_DEBUG` をはじめとした様々な方法


CMAKE_LANG_FLAGS_DEBUG は、CMake の Debug ビルドタイプで使用されるコンパイラフラグを指定するための変数です。この変数は、デバッグ情報を生成したり、コードの最適化を無効化したりするなどのフラグを追加するために使用できます。

構文

CMAKE_LANG_FLAGS_DEBUG <lang> <flags>
  • <flags> は、スペースで区切られたコンパイラフラグのリストです。
  • <lang> は、C、C++、Fortran、Objective-C などのプログラミング言語を指定します。

CMAKE_LANG_FLAGS_DEBUG C "-g -O0"
CMAKE_LANG_FLAGS_DEBUG C++ "-g -Wall"

この例では、C 言語のデバッグビルドでは -g フラグと -O0 フラグが使用され、C++ 言語のデバッグビルドでは -g フラグと -Wall フラグが使用されます。

詳細

CMAKE_LANG_FLAGS_DEBUG 変数は、CMake の target_link_libraries コマンドと組み合わせて使用できます。このコマンドは、ターゲットにリンクするライブラリを指定します。CMAKE_LANG_FLAGS_DEBUG 変数は、ライブラリのコンパイルに使用されるフラグにも影響を与えます。

利点

  • コンパイラ警告の有効化
  • コードの最適化の無効化
  • デバッグ情報の生成
  • 詳細については、CMake のドキュメントを参照してください。
  • 特定のコンパイラフラグがすべてのコンパイラでサポートされているとは限らないことに注意してください。
  • CMAKE_LANG_FLAGS_DEBUG 変数は、ビルドシステム全体に影響を与えるため、注意して使用する必要があります。
  • この変数は、Windows、Linux、macOS など、さまざまなプラットフォームでサポートされています。
  • CMAKE_LANG_FLAGS_DEBUG 変数は、CMake 3.8 以降で使用できます。


cmake_minimum_required(VERSION 3.8)

project(myproject)

set(CMAKE_CXX_STANDARD 14)

add_executable(myprogram main.c main.cpp)

target_link_libraries(myprogram mylib)

# C 言語のデバッグビルド設定
set(CMAKE_LANG_FLAGS_DEBUG C "-g -O0 -Wall")

# C++ 言語のデバッグビルド設定
set(CMAKE_LANG_FLAGS_DEBUG CXX "-g -Wall -std=c++14")

このコードでは、以下の処理が行われます。

  1. CMake のバージョンが 3.8 以降であることを確認します。
  2. myproject という名前のプロジェクトを作成します。
  3. C++ 言語の標準を C++14 に設定します。
  4. main.cmain.cpp というソースファイルから myprogram という名前の実行可能ファイルを作成します。
  5. myprogram 実行可能ファイルを mylib ライブラリにリンクします。
  6. C 言語のデバッグビルドでは -g フラグ、-O0 フラグ、-Wall フラグを使用するように設定します。
  7. C++ 言語のデバッグビルドでは -g フラグ、-Wall フラグ、-std=c++14 フラグを使用するように設定します。

このコードをビルドするには、次のコマンドを実行します。

cmake .
make

ビルドが成功すると、myprogram という名前の実行可能ファイルが作成されます。この実行可能ファイルをデバッグするには、次のコマンドを実行します。

gdb myprogram
  • メモリリークの検出を有効にする:
set(CMAKE_LANG_FLAGS_DEBUG C "-g -O0 -Wall -fsanitize=address")
set(CMAKE_LANG_FLAGS_DEBUG CXX "-g -Wall -std=c++14 -fsanitize=address")
  • コードカバレッジの生成を有効にする:
set(CMAKE_LANG_FLAGS_DEBUG C "-g -O0 -Wall -fcoverage")
set(CMAKE_LANG_FLAGS_DEBUG CXX "-g -Wall -std=c++14 -fcoverage")


個別のコンパイラフラグオプションを使用する

特定のコンパイラフラグのみを設定したい場合は、target_compile_options コマンドや add_custom_command コマンドを使用して、個別に設定することができます。

例:target_compile_options コマンドを使用する

target_compile_options(myprogram PRIVATE "-g -O0 -Wall")

この例では、myprogram ターゲットのコンパイル時に -g フラグ、-O0 フラグ、-Wall フラグが使用されます。

例:add_custom_command コマンドを使用する

add_custom_command(
    TARGET myprogram
    COMMAND ${CMAKE_CXX_COMPILER} -g -O0 -Wall -o myprogram main.cpp
)

この例では、main.cpp ファイルを myprogram という名前の実行可能ファイルにコンパイルするカスタムコマンドが作成されます。このコマンドでは、-g フラグ、-O0 フラグ、-Wall フラグが使用されます。

CMake のキャッシュ変数を使用する

CMake のキャッシュ変数は、ビルドシステム全体で設定を共有するために使用できます。これらの変数は、set コマンドを使用して設定できます。

例:CMake のキャッシュ変数を使用する

set(CMAKE_C_FLAGS_DEBUG "-g -O0 -Wall")
set(CMAKE_CXX_FLAGS_DEBUG "-g -Wall -std=c++14")

この例では、CMAKE_C_FLAGS_DEBUG 変数と CMAKE_CXX_FLAGS_DEBUG 変数に、C 言語と C++ 言語のデバッグビルドで使用されるコンパイラフラグが設定されます。これらの変数は、target_compile_options コマンドや add_custom_command コマンドで使用できます。

サードパーティのツールを使用する

CMake には、CTestCPack などのサードパーティ製ツールを使用する方法もあります。これらのツールは、コンパイラフラグの設定など、さまざまなタスクを自動化するために使用できます。

利点

  • ビルドシステム全体で設定を共有できる
  • 特定のコンパイラやプラットフォームに固有のフラグを設定できる
  • 個々のニーズに合わせた柔軟な設定が可能
  • 特定のコンパイラやプラットフォームでのみ使用できるフラグがある場合がある
  • CMAKE_LANG_FLAGS_DEBUG 変数よりも複雑な場合がある