Maison > développement back-end > C++ > Comment configurer efficacement les indicateurs du compilateur dans les projets CMake multi-cibles ?

Comment configurer efficacement les indicateurs du compilateur dans les projets CMake multi-cibles ?

Linda Hamilton
Libérer: 2024-11-01 19:43:30
original
624 Les gens l'ont consulté

How to Efficiently Configure Compiler Flags in Multi-Target CMake Projects?

Configuration efficace des indicateurs de compilateur dans les projets CMake multiplateformes

Définition des options du compilateur pour différents compilateurs et configurations

Pour répondre à vos préoccupations concernant la définition des options du compilateur pour différents compilateurs et configurations, voici une approche mise à jour et améliorée :

<code class="cmake">cmake_minimum_required(VERSION 3.15)

project(HelloWorld)

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

add_compile_options("${CXX_FLAGS}")

add_executable(HelloWorld "main.cpp")

target_compile_features(HelloWorld PUBLIC cxx_lambda_init_captures)</code>
Copier après la connexion

Améliorations :

  • Utilise la syntaxe d'expression du générateur CMake introduite dans CMake 3.8, ce qui est plus simple et plus concis.
  • Profite de la fonction add_compile_options(), qui vous permet de spécifier les options du compilateur de manière claire et lisible.
  • Supprime le besoin de définir manuellement CMAKE_CXX_FLAGS et variables similaires.
  • Spécifie les fonctionnalités C à l'aide de target_compile_features() au lieu de définir explicitement la norme C.

Projets CMake multi-cibles

Pour répondre à votre désir d'un projet multi-cible où chaque compilateur et configuration a sa propre cible, vous pouvez utiliser l'approche suivante :

<code class="cmake">cmake_minimum_required(VERSION 3.15)

project(HelloWorld)

set(COMPILERS MSVC Clang GNU)
set(CONFIGURATIONS Debug Release)

foreach(_compiler IN LISTS COMPILERS)
    foreach(_config IN LISTS CONFIGURATIONS)
        add_executable(HelloWorld_${_compiler}_${_config} "main.cpp")

        # Set compiler flags for this target
        target_compile_options(HelloWorld_${_compiler}_${_config} PUBLIC
            "$<IF:$<CXX_COMPILER_ID:${_compiler}>,"
                "/W4;$<$<CONFIG:${_config}>:/O2>,"
                "-Wall;-Wextra;-Werror;"
                    "$<$<CONFIG:${_config}>:-O3>"
                    "$<$<CXX_COMPILER_ID:Clang>:-stdlib=libc++>"
            ">"
        )

        # Set C++ feature requirements for this target
        target_compile_features(HelloWorld_${_compiler}_${_config} PUBLIC cxx_lambda_init_captures)
    endforeach()
endforeach()</code>
Copier après la connexion

Améliorations :

  • Crée plusieurs cibles avec des noms uniques basés sur les combinaisons de compilateur et de configuration.
  • Configure les indicateurs du compilateur et les fonctionnalités C pour chaque cible séparément.

Bonnes pratiques et lectures complémentaires

Voici quelques ressources supplémentaires qui peuvent être utiles :

  • [Tutoriel CMake : cibles multiples](https://www.cmake.org/cmake-docs/latest/manual/cmake-tutorial/MultipleTargets.html )
  • [Guide d'empaquetage et de déploiement CMake](https://cmake.org/cmake-docs/latest/manual/cmake-packaging.html#packaging-multiple-projects-in-a-single-project )

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 de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal