ジェネレーター式を使用してクロスプラットフォーム CMake プロジェクトでコンパイラー フラグを設定する方法

DDD
リリース: 2024-11-03 01:08:02
オリジナル
611 人が閲覧しました

How to Set Compiler Flags in Cross-Platform CMake Projects Using Generator Expressions?

クロスプラットフォーム CMake プロジェクトでコンパイラー フラグを設定する最新の方法

CMake ジェネレーター式を使用したエレガントなソリューション

あなたのアプローチは有効ですが、最新の CMake は、CMake のジェネレーター式を使用して、より簡潔で堅牢なソリューションを提供します。

cmake_minimum_required(VERSION 3.8)

project(HelloWorld)

string(
    APPEND _opts
    "$<IF:$<CXX_COMPILER_ID:MSVC>,"
        "/W4;$<$<CONFIG:RELEASE>:/O2>,"
        "-Wall;-Wextra;-Werror;"
            "$<$<CONFIG:RELEASE>:-O3>"
            "$<$<CXX_COMPILER_ID:Clang>:-stdlib=libc++>"
    ">"
)

add_compile_options("${_opts}")
ログイン後にコピー

元のアプローチと比較して、このメソッドは以下を利用します。

  • コンパイラと構成に基づいてコンパイラ オプションを条件付きで定義するジェネレータ式。
  • オプションをリストに蓄積する string(APPEND ...) コマンド。
  • add_compile_options() 関数すべてのターゲットのオプションを設定します。

手動フラグ設定の非推奨

お気づきのとおり、CMAKE_CXX_FLAGS および同様の変数を手動で設定することは一般的に推奨されません。代わりに、add_compile_options() 関数を使用して、グローバル フラグを変更せずにオプションを追加することをお勧めします。

マルチターゲット プロジェクトのセットアップ

同じディレクトリにある場合は、CMake のターゲット プロパティを使用できます。

add_executable(HelloWorld_Debug_Clang HelloWorld.cpp)
target_compile_options(HelloWorld_Debug_Clang PRIVATE "-std=c++1z;-W4")
target_link_libraries(HelloWorld_Debug_Clang PRIVATE libc++)

add_executable(HelloWorld_Release_Gcc HelloWorld.cpp)
target_compile_options(HelloWorld_Release_Gcc PRIVATE "-std=c++1z;-W3")
target_link_libraries(HelloWorld_Release_Gcc PRIVATE libstdc++)
ログイン後にコピー

このアプローチにより、単一のプロジェクト ファイルを維持しながら、ターゲットごとに異なるコンパイラ オプションを指定できます。

Modern Best実践方法

  • 条件付きフラグの設定には CMake ジェネレーター式を使用します。
  • CMAKE_CXX_FLAGS を手動で設定するよりも add_compile_options() を優先します。
  • 個別のコンパイラ オプションを使用して複数のターゲットを作成します。クロスプラットフォームの互換性を実現します。
  • ビルド ラッパー スクリプトを利用して、単一の CMake ファイルから複数の構成を生成します。

以上がジェネレーター式を使用してクロスプラットフォーム CMake プロジェクトでコンパイラー フラグを設定する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート