[解決済み] CMAKE_BUILD_TYPE が CMakeLists.txt で使用されていない。
質問
私のデフォルトのビルド構成を 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 ...
マルチコンフィギュレーション
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 で動作するようになり、満足です.
の素敵な本からの引用です。 いい人 の素敵な本から引用したものです(強調)。
なぜ悩む必要があるのでしょうか?さまざまなシステムでプログラミングをしたり、さまざまなコンパイラを使ったりする人は、とても気になるものです。 様々なコンパイラを使ってプログラミングする人は、とても気にします。 無駄 時間 を強いられるからです。と主張する人たちは 気にしない について ポータビリティを気にしないと主張する人は、たいてい単一のシステムしか使っていないので 言語とは私のコンパイラが実装するものだ」という態度をとる余裕があるからです。 これは 狭い と 近視眼的 を見ることができます。もしあなたのプログラムが成功すれば、それは移植される可能性があります。 移植される可能性が高いので、誰かが実装依存の機能に関連する問題を発見し修正しなければなりません。 実装に依存する機能に関する問題を発見し、修正する必要があります。さらに、プログラムはしばしば、同じシステム用の他のコンパイラでコンパイルする必要があります。 また、同じシステムに対して他のコンパイラでコンパイルする必要があることも多く、将来リリースされるコンパイラでも、同じシステムに対して異なる動作をすることがあります。 また、同じシステムの他のコンパイラでコンパイルする必要があることも多く、将来リリースされるお気に入りのコンパイラでも、現在のものとは異なる動作をする可能性があります。それなら プログラムを書くときに実装の依存性を把握し、その影響を抑えることは プログラムを書くときに実装の依存性を知り、その影響を抑えることは、後から混乱を解きほぐそうとするよりもはるかに簡単です。
関連
-
[解決済み] ビルドを開始します。「パッケージが見つかりません" (GOPATHが設定されているにもかかわらず)
-
[解決済み] RZCジェネレーションがコード-2147450730で終了しました。
-
[解決済み】Gradle buildscriptの依存関係
-
[解決済み] サブディレクトリにあるGolangのテスト
-
[解決済み] GTestとCMakeを使った作業の始め方
-
[解決済み] gmakeとmakeの違いは何ですか?
-
[解決済み] msbuildでソリューションのプロジェクトファイルを指定する
-
[解決済み] コンパイルコードと実行コードの違いは何ですか?
-
[解決済み] 専用の「ビルドサーバー」の目的は何ですか?[クローズド]
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] ビルドを開始します。「パッケージが見つかりません" (GOPATHが設定されているにもかかわらず)
-
[解決済み] RZCジェネレーションがコード-2147450730で終了しました。
-
[解決済み] CMakeにおけるデバッグとリリースの比較
-
[解決済み】Gradle buildscriptの依存関係
-
[解決済み] サブディレクトリにあるGolangのテスト
-
[解決済み] gmakeとmakeの違いは何ですか?
-
[解決済み] msbuildでソリューションのプロジェクトファイルを指定する
-
[解決済み] コンパイルコードと実行コードの違いは何ですか?
-
[解決済み] 専用の「ビルドサーバー」の目的は何ですか?[クローズド]