[解決済み] CMakeで一般的なコンパイルフラグを設定するための最新の方法とは何ですか?
質問
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
キーワードは
のスコープを定義します。
. 例えば
foo
を
bar
と
target_link_libraries(bar foo)
:
-
PRIVATE
のオプションは、ターゲット自身に対してのみ適用されます (foo
) にのみ適用され、それに対してリンクしている他のライブラリ (コンシューマ) には適用されません。 -
INTERFACE
のオプションは、コンシューマ・ターゲットにのみ適用されます。bar
-
PUBLIC
オプションは、元のターゲットであるfoo
と消費するターゲットbar
関連
-
[解決済み] CMakeでポータブルパラレルビルドを設定するには?
-
[解決済み] CMAKE_SOURCE_DIRはどこですか?
-
[解決済み] CMakeのオプション()をコマンドラインで設定する方法
-
[解決済み] .cmakeファイルの目的は何ですか?
-
[解決済み] MakefileとCMakeを使ったコンパイルの違いについて
-
[解決済み】CMakeをGNU Makeと一緒に使う:正確なコマンドを見るにはどうすればいい?
-
[解決済み】CMake:スクリプト内のアクセス可能なすべての変数を出力する
-
[解決済み】CMakeは具体的にどのように動作するのですか?
-
[解決済み] CMakeにソースディレクトリにある静的ライブラリをリンクするように指示するには?
-
[解決済み] CMakeにおける関数とマクロの比較
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] CMake の add_definitions が動作しないようです。
-
[解決済み] CMAKE_SOURCE_DIRはどこですか?
-
[解決済み] CMakeのオプション()をコマンドラインで設定する方法
-
[解決済み] cmake --verbose=1` は冗長なcmake出力をしますが、`cmake -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON` はそうならないのはなぜですか?
-
[解決済み】CMake:スクリプト内のアクセス可能なすべての変数を出力する
-
[解決済み】変数を設定・使用するCMakeの構文とは?
-
[解決済み】CMakeファイルにリンカやコンパイルフラグを追加する方法は?
-
[解決済み】CMakeは具体的にどのように動作するのですか?
-
[解決済み] CMake target_include_directories スコープの意味
-
[解決済み] CMakeで文字列を複数行に分割するには?