1. ホーム
  2. build

[解決済み] CMAKE_BUILD_TYPE が CMakeLists.txt で使用されていない。

2023-03-02 03:46:17

質問

私のデフォルトのビルド構成を Release に設定するのに苦労しています。私の CMakeLists.txt ファイルで、私は CMAKE_BUILD_TYPE をファイルの一番上に設定します。

#enable Release ALWAYS, configure vars
set(CMAKE_BUILD_TYPE Release)
set(EXECUTABLE_NAME "ParticleSimulator")
set(VERSION_MAJOR 0)
set(VERSION_MINOR 2)

しかし、私のプロジェクトを構築し、ソリューションを開くと、CMakeListsファイルで指定したものとは逆に、常にデバッグモードが表示されます。私は何を間違えているのでしょうか?

私はそこに他の質問のいくつかを見ましたが、この質問に特化したものを見ませんでした。

の要点は CMakeLists.txt .

どのように解決するのですか?

ジェネレーターには、シングルコンフィギュレーションとマルチコンフィギュレーションの2種類があります。

シングルコンフィギュレーション

Makeライクなジェネレータ。 Unix Makefile , NMake の Makefile , MinGW Makefiles , ...

生成ステップでコンフィギュレーションタイプを設定します。

cmake -H. -B_builds/Debug -DCMAKE_BUILD_TYPE=Debug "-GUnix Makefiles"

この場合、ビルドステップは 常に デバッグ :

> cmake --build _builds/Debug
/usr/bin/c++ -g ...
> cmake --build _builds/Debug --config Debug # `--config` ignored
/usr/bin/c++ -g ...
> cmake --build _builds/Debug --config Release # yep, ignored
/usr/bin/c++ -g ...

マルチコンフィギュレーション

IDE ジェネレータ。 ビジュアルスタジオ , Xcode

CMAKE_BUILD_TYPE を生成するステップは、両方とも無視されます。

> cmake -H. -B_builds -DCMAKE_BUILD_TYPE=Debug "-GVisual Studio 12 2013 Win64"

> cmake -H. -B_builds -DCMAKE_BUILD_TYPE=Release "-GVisual Studio 12 2013 Win64"

も同じ効果を持ちます。

これは、すべての構成が内部的なものであるためです(つまり _builds/msvc-opaque/Release_builds/msvc-opaque/Debug とかでもいいんだけど)。を使うことができます。 --config オプションで切り替えます。

> cmake --build _builds --config Release
cl /O2 ...
> cmake --build _builds --config Debug
cl /Od ...

コントロール(?)

はい、できます。ただ、定義する cmake_configuration_typesを定義するだけです。 :

# Somewhere in CMakeLists.txt
message("Generated with config types: ${CMAKE_CONFIGURATION_TYPES}")

デフォルトの出力です。

-- Detecting CXX compiler ABI info - done
Generated with config types: Debug;Release;MinSizeRel;RelWithDebInfo
-- Configuring done

書き換えます。

> cmake -H. -B_builds -DCMAKE_CONFIGURATION_TYPES="Debug;Release" "-GVisual Studio 12 2013 Win64"
-- Detecting CXX compiler ABI info - done
Generated with config types: Debug;Release
-- Configuring done

<イグ

独自の設定タイプを定義することも可能です。

> cmake -H. -B_builds -DCMAKE_CONFIGURATION_TYPES="Debug;MyRelease" -DCMAKE_CXX_FLAGS_MYRELEASE="/My-Rel-flag" -DCMAKE_EXE_LINKER_FLAGS_MYRELEASE="/My-Linker-flags" "-GVisual Studio 12 2013 Win64"

<イグ

そしてビルド。

cmake --build _builds --config MyRelease

メチャクチャ(?)

コツを知っていれば全く問題ありません :) これは、スクリプト/CIサーバ/ドキュメントのビルド指示などで、設定をビルド/テストする方法です。

> CONFIG=Debug
> cmake -H. -B_builds "-DCMAKE_BUILD_TYPE=${CONFIG}" # Set Debug to Makefile, ignored by IDE
> cmake --build _builds --config "${CONFIG}" # Build Debug in IDE, ignored by Makefile
> (cd _builds && ctest -VV -C "${CONFIG}") # Test Debug in IDE, ignored by Makefile

悪いパターン

if(CMAKE_BUILD_TYPE STREQUAL Debug) # Burn it with fire!!!
set(CMAKE_BUILD_TYPE MySuperRelease) # Be ready to catch a bug from IDE user...

いいもの

set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} --my-debug-flags")

いい感じに動く。

target_compile_definitions(MyTarget PUBLIC "$<$<CONFIG:Debug>:MYDEBUG_MACRO>")

ありがとうございます! :) 一人のプログラマの一日が救われますね。

Makefile で動作するようになり、満足です.

の素敵な本からの引用です。 いい人 の素敵な本から引用したものです(強調)。

なぜ悩む必要があるのでしょうか?さまざまなシステムでプログラミングをしたり、さまざまなコンパイラを使ったりする人は、とても気になるものです。 様々なコンパイラを使ってプログラミングする人は、とても気にします。 無駄 時間 を強いられるからです。と主張する人たちは 気にしない について ポータビリティを気にしないと主張する人は、たいてい単一のシステムしか使っていないので 言語とは私のコンパイラが実装するものだ」という態度をとる余裕があるからです。 これは 狭い 近視眼的 を見ることができます。もしあなたのプログラムが成功すれば、それは移植される可能性があります。 移植される可能性が高いので、誰かが実装依存の機能に関連する問題を発見し修正しなければなりません。 実装に依存する機能に関する問題を発見し、修正する必要があります。さらに、プログラムはしばしば、同じシステム用の他のコンパイラでコンパイルする必要があります。 また、同じシステムに対して他のコンパイラでコンパイルする必要があることも多く、将来リリースされるコンパイラでも、同じシステムに対して異なる動作をすることがあります。 また、同じシステムの他のコンパイラでコンパイルする必要があることも多く、将来リリースされるお気に入りのコンパイラでも、現在のものとは異なる動作をする可能性があります。それなら プログラムを書くときに実装の依存性を把握し、その影響を抑えることは プログラムを書くときに実装の依存性を知り、その影響を抑えることは、後から混乱を解きほぐそうとするよりもはるかに簡単です。