起動したコマンド・プロンプトを使ってCMakeLists.txtとhello.cppを置いているフォルダへ移動して下さい。(なお、ubuntuでも端末を使って同様な操作が可能です。BUILD_TYPE=Release指定したビルド・モード通りにコンパイル・オプションが定義され、その内容が表示されました。期待通りに動作しています。Studio用のソリューション(*.sln)が生成されません。Studioはマルチ・コンフィグレーションなので如何ともし難い部分です。Studioを使いたいのでソリューション(*.sln)を生成させたいです。用に生成することが出来ないわけではありません。普通にコマンド・プロンプトを起動して、hello.cppとCMakeLists.txtのあるフォルダへ移動します。下記コマンドにより、ソリューションを生成します。Studioがインストールされていれば-Gを省略することができますので、省略しています。このコマンド・プロンプトはこの直ぐ後で使うので立ち上げたままにしておいて下さい。Studioを起動して下さい。プロジェクトに設定(A)」を選択し、CTRL+F5(実行後コマンド・プロンプトが一時停止します。)にてビルドと実行を行って下さい。デバッグ・ビルドされることを期待しますね。BUILD_TYPEには”Debug”が設定されていることをつい期待してしまいます。World!!BUILD_TYPE=Releaseこの辺の振る舞いに私は本当に振り回されパニックでした。しては当たり前なのです。コマンドでビルド・システム(≒*.sln)を生成する時に解釈されるものですから、生成されてしまった後の切り替えに対応していません。BUILD_TYPEシンボルに”Debug”を設定し、そうでなければ”Release”を設定しています。CMAKE_BUILD_TYPEを指定しませんでしたので、BUILD_TYPEシンボルには”Release”が設定されているのです。Studioに戻ると「外部で変更されたので、再度読み込むか?」のようなダイアログが表示されるので「全てに適用(A)」を押して読み込んで下さい。Ctrl+F5でビルドして実行すると、めでたくDebugと表示されます。World!!BUILD_TYPE=Debug4-4.だがしかし!「アクティブソリューション構成(C)」をReleaseに切り替えて、Ctrl+F5で実行してみて下さい。鋭い方の中には既に予想されている方もいると思いますが、結果はDebugと表示されます。上述したように、CMAKE_BUILD_TYPEの内容で切り替える処理は、ソリューション(*.sln)を生成する際に解釈されます。「アクティブソリューション構成(C)」を切り替えても変わらないのです。これでは事実上役に立ちません。生成をやり直す必要があるのでは困ります。リリース・ビルドしたつもりで、CMakeでDebug生成したものを配布してしまったら目も当てられません。5.CMakeはこの状況に対処しています!シングル・コンフィグレーションのビルド・ツールは生成時にDebug/Releaseを切り替え、マルチ・コンフィグレーションのビルド・ツールはビルド時にDebug/Releaseを切り替えます。前者は素直ですが、後者はCMakeが生成した後、もうCMakeが走っていない時に対処する必要があるので、技術的にも難しそうに感じます。最終的に生成するものは、MSBuildの場合、*.vcxprojファイルです。この中にDebugビルド用とReleaseビルド用の両方のビルド設定が入っています。CMakeのif文での分岐は、CMAKE_BUILD_TYPEの条件と複合して他の条件を入れることもできますし、それらをDebugとRelaseに分けて整理し、*.vcxprojファイルを生成するのは至難の業と思います。5-1.CMakeの解CMakeはこの状況に対し明快な解を採用しています。先程のコンパイル・オプションを指定する変数CMAKE_CXX_FLAGSにDebug用とRelease用の変数を設けるのです。Releaseビルド時に追加するオプションを定義するこれなら、CMake自体の構造も比較的単純さを保てます。書くことができるのです。頭のいい対処と思います。DebugとRelease両方(*2)解り易さのため、DebugとRelease両方と書きましたが、実際にはRelWithDebInfo、MinSizeRelやユーザ定義のビルド・モードも含む全てのビルド・モード共通のコンパイル・オプションを設定します。この仕組は、変数名だけでなく、プロパティ名、generator-expressionsで採用されています。公式のマニュアルへリンクを貼っています。等のビルド・モード名を大文字にしたものが入ります。generator-expressionsは$<CONFIG>にてビルド・モードを調べることができます。変数とプロパティは当講座の比較的早いタイミングで解説します。generator-expressionsは頻繁には使わないし難しいので解説する場合でもかなり後の方になりそうです。私自身十分に理解しているとは言い難いので解説を見送るかも知れません。hello.cpp)4-1.のCMakeLists.txtと見比べるとスッキリし、かつ、マルチ・コンフィグレーションにも対応するのでスグレモノです。Studioで生成し実行してみました。BUILD_TYPE=Releaseシングル・コンフィグレーションではCMAKE_BUILD_TYPE指定通りにコンパイラ・オプションが反映されています。マルチ・コンフィグレーションでもCMAKE_BUILD_TYPEを書くことはできますが、丸っと無視され「アクティブソリューション構成(C)」の設定が反映されています。5-3.ちょっと気になる結果についてシングル・コンフィグレーションで、CMAKE_BUILD_TYPEを指定しなかった時の振る舞いが謎です。CMakeのジェネレータは処理系毎に別途実装されているようですので、gccとNMakeでは振る舞いが異なるのだろうと思います。念のため、どんなふうに振る舞っているのか確認してみました。Makefileにはコンパイラ・オプション変数CXX_FLAGSがあります。grepしてみたところ、CMakeはこれをCMakeFiles\hello.dir\flags.makeで定義しているようです。その内容を調べました。/DBUILD_TYPE=\”Release\”gccとMinGWは、CMAKE_CXX_FLAGS_DEBUG、CMAKE_CXX_FLAGS_RELEASEについてCMAKE_BUILD_TYPEで指定したものが追加映され、指定していないものは追加されないようです。NMakeはCMAKE_BUILD_TYPE指定なしならDebugと指定したものとして処理しているようですね。何か処理系の都合があるのかも知れません。6.まとめ今回、シングル・コンフィグレーションとマルチ・コンフィグレーションについて解説してみました。意外に混乱を招く部分で、これらの振る舞いや設定方法も理解していないと、マルチ・プラットフォーム対応が困難であることを説明できたと思います。基本的には、CMakeLists.txt内でCMAKE_BUILD_TYPE変数を使わないことと思います。StudioやXcodeでビルド時にビルド・モードを切り替えるとハマる可能性が飛躍的に高くなります。ところで、DebugとReleaseはビルド時に切り替えるのに何故に「構成」と呼ぶのか不思議でした。慣れていたからということのようです。昔は主にアセンブラを使っていました。少なくとも当時のアセンブラに最適化はなくDebugビルド、Releaseビルドなんてありません。リンク後にCPUへ書き込む際に不要なデバッグ情報を削ぎ落とすという使い方でした。してからビルドすることがほとんどです。この時点で「構成」するということのようです。使うCMakeコマンドについて解説したいと思います。コメントをキャンセルメールアドレスが公開されることはありません。テクノロジーの登録商標です。technology.。