Maison  >  Article  >  développement back-end  >  Comment définir des indicateurs de compilateur dans des projets CMake multiplateformes à l'aide d'expressions génératrices ?

Comment définir des indicateurs de compilateur dans des projets CMake multiplateformes à l'aide d'expressions génératrices ?

DDD
DDDoriginal
2024-11-03 01:08:02609parcourir

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

Une manière moderne de définir des indicateurs de compilateur dans des projets CMake multiplateformes

Solution élégante utilisant des expressions de générateur CMake

Bien que votre approche soit valide, CMake moderne fournit une solution plus concise et robuste en utilisant les expressions génératrices de 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}")

Par rapport à votre approche originale, cette méthode exploite :

  • Expressions génératrices pour définir conditionnellement les options du compilateur en fonction du compilateur et de la configuration.
  • La commande string(APPEND ...) pour accumuler les options dans une liste.
  • La fonction add_compile_options() pour définissez les options pour toutes les cibles.

Dépréciation du réglage manuel des indicateurs

Comme vous l'avez remarqué, il est généralement déconseillé de définir manuellement CMAKE_CXX_FLAGS et des variables similaires. Au lieu de cela, préférez utiliser la fonction add_compile_options() pour ajouter des options sans modifier les indicateurs globaux.

Configuration de projet multi-cibles

Pour créer plusieurs cibles avec différentes options dans le même répertoire, vous pouvez utiliser les propriétés cible de 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++)

Cette approche vous permet de spécifier différentes options de compilateur pour chaque cible, tout en conservant un seul fichier de projet.

Modern Best Pratiques

  • Utilisez les expressions du générateur CMake pour la définition des indicateurs conditionnels.
  • Favorisez add_compile_options() plutôt que de définir manuellement CMAKE_CXX_FLAGS.
  • Créez plusieurs cibles avec des options de compilateur distinctes pour une compatibilité multiplateforme.
  • Utilisez un script de wrapper de build pour générer plusieurs configurations à partir d'un seul fichier CMake.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn