CMakeで一般的なコンパイルフラグを設定するための最新の方法は何ですか?


84

コンパイラにフラグを取得するためにCMakeによって提供される複数のメカニズムがあります。

現代の使用で他よりも好まれる方法はありますか?もしそうなら、なぜですか?また、この方法をMSVCなどの複数の構成システムでどのように使用できますか?


回答:


94

最新のCMake(バージョン2.8.12以降)target_compile_optionsでは、ターゲットプロパティを内部的に使用するを使用する必要があります。

CMAKE_<LANG>_FLAGSはグローバル変数であり、最もエラーが発生しやすい変数です。また、非常に便利なジェネレータ式もサポートしていません。

add_compile_options これはディレクトリプロパティに基づいています。これは状況によっては問題ありませんが、通常、オプションを指定する最も自然な方法ではありません。

target_compile_optionsソースファイルのコンパイルオプションは、ファイルが配置されているディレクトリではなく、ファイルが属するプロジェクトによって決定されるため、ターゲットごとに(COMPILE_OPTIONSおよびINTERFACE_COMPILE_OPTIONSターゲットプロパティを設定することで)機能します。これにより、通常、最もクリーンなCMakeコードが生成されます。ハードディスクに)。これには、要求された場合に依存するターゲットへのオプションの受け渡しを自動的に処理するという追加の利点があります

それらはもう少し冗長ですが、ターゲットごとのコマンドを使用すると、さまざまなビルドオプションを適度にきめ細かく制御でき、(私の個人的な経験では)長期的には頭痛の種になる可能性が最も低くなります。

理論的には、を使用してそれぞれのプロパティを直接設定することもできますがset_target_propertiestarget_compile_options通常はより読みやすくなります。

たとえば、fooジェネレータ式を使用して構成に基づいてターゲットのコンパイルオプションを設定するには、次のように記述できます。

target_compile_options(foo PUBLIC "$<$<CONFIG:DEBUG>:${MY_DEBUG_OPTIONS}>")
target_compile_options(foo PUBLIC "$<$<CONFIG:RELEASE>:${MY_RELEASE_OPTIONS}>")

12
オプションをtarget_compile_options 追加して、このように最後の行を変更して読みやすくすることに注意してください)

2
@ComicSansMSすばらしい答えであり、インターネットで見つけた最高の(そして最新の)ものです。ありがとう!
ela782 2015年

同じ厳密なコンパイルフラグのセットをグローバルに使用したい場合、それを行うための最新の最良の方法は何ですか?target_compile_optionsを使用して異なるターゲットに同じフラグを何度も指定することは悪い考えのようです
user3667089 2017

1
@ user3667089通常、ターゲット固有のプロパティは、変数またはディレクトリのプロパティによって初期化されます。それぞれのプロパティのマンページは、正確にどちらかを示しています。コンパイルオプションの場合、COMPILE_OPTIONSdirectoryプロパティがこれを行います。add_compile_optionsコマンドを使用してこれを設定できます。これが適切なアプローチであるオプションは、通常、ほとんどありません。
ComicSansMS 2017

6
@ComicSansMS PUBLICinの用途は何target_compile_optionsですか?
ラマナレッディ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.