1. ホーム
  2. cmake

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

2023-01-03 19:08:26

質問

CMakeには、コンパイラにフラグを与えるための複数のメカニズムがあります。

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

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

最新の CMake (バージョン 2.8.12 以降) では、次のようにします。 target_compile_options これは内部的にターゲットプロパティを使用します。

CMAKE_<LANG>_FLAGS はグローバル変数であり、使用する際に最もエラーが起こりやすい変数です。また、この変数では ジェネレータ式 をサポートしていません。

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

target_compile_options はターゲット毎に動作します (これは COMPILE_OPTIONS INTERFACE_COMPILE_OPTIONS ターゲットプロパティ) を使用すると、ソースファイルのコンパイルオプションは、ファイルがハードディスク上のどのディレクトリに配置されるかではなく、どのプロジェクトに属するかによって決まるため、通常最もきれいな CMake コードになります。これには、さらに次のような利点があります。 でのオプションの受け渡しが自動的に行われることです。 に渡すことができます。

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

理論的には、それぞれのプロパティを直接 set_target_properties を使って直接設定することもできますが target_compile_options の方が読みやすいでしょう。

例えば、ターゲットのコンパイルオプションを設定するために foo を書くことができるジェネレータ式を使った設定に基づきます。

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

PUBLIC , PRIVATE そして INTERFACE キーワードは のスコープを定義します。 . 例えば foobartarget_link_libraries(bar foo) :

  • PRIVATE のオプションは、ターゲット自身に対してのみ適用されます ( foo ) にのみ適用され、それに対してリンクしている他のライブラリ (コンシューマ) には適用されません。
  • INTERFACE のオプションは、コンシューマ・ターゲットにのみ適用されます。 bar
  • PUBLIC オプションは、元のターゲットである foo と消費するターゲット bar