Comment définir les options de compilation avec CMake dans Visual Studio 2017
Visual Studio 2017 est livré avec le plein de CMake intégration. Pour en apprendre davantage sur cette combinaison, je commence avec cet échantillon de base:
# CMakeLists.txt
cmake_minimum_required(VERSION 3.8)
project(foo)
add_executable(foo foo.cpp)
et
//foo.cpp
int main() {}
Cela génère des scripts de création, et les compile et les liens avec aucun problème. Cela a été facile.
Essayant de configurer les options du compilateur, d'autre part, s'est avéré être rien de trivial. Dans mon cas, j'ai été de tenter de définir le niveau d'alerte de 4.
La solution la plus évidente
add_compile_options("/W4")
n'a pas marché comme prévu. La ligne de commande passés au compilateur contient maintenant deux /W4
(comme prévu) ainsi que /W3
(repris d'ailleurs), la production de l'avertissement suivant:
cl : Command line warning D9025: overriding '/W3' with '/W4'
Pour contourner ce problème, j'aurais besoin de remplacer tout incompatible option du compilateur(s) au lieu de simplement ajouter un. CMake ne pas fournir une aide immédiate à ce, et la solution standard (comme cette Q&A suggère) semble être:
if(CMAKE_CXX_FLAGS MATCHES "/W[0-4]")
string(REGEX REPLACE "/W[0-4]" "/W4" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
else()
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4")
endif()
Ceci, cependant, a deux questions:
- Il définit le mondial
CMAKE_CXX_FLAGS
, s'appliquant à tous C++ objectifs. Ce ne peut pas être prévu (pas un problème pour moi). - Il n'a pas d'échelle. Pour chaque option du compilateur à ajouter, vous aurez à lire sur les options incompatibles, et manuellement la bande de ceux du premier. Cela va inévitablement échouer1.
Ma question est double:
- D'où vient le CMake intégration ramasser les paramètres par défaut, et cela peut-il être contrôlé?
- Comment pouvez-vous définir les options du compilateur en général? (Si c'est trop large d'un sujet, je serais heureux pour obtenir de l'aide sur la configuration de l'alerte de niveau seulement).
1 d'ailleurs, la solution que j'ai répliqué ne tient pas compte de la /Wall
option, ce qui est incompatible avec /W4
.
Merci pour la confirmation, que CMake n'est pas directement en charge le réglage du niveau d'avertissement. Encore, les liens que vous avez posté ne sont pas immédiatement utiles pour moi: Ruslo du travail prend uniquement en charge le réglage de
/Wall
, tandis que le second lien fonctionne en modifiant le CMAKE_CXX_FLAGS
. Le répondre posté par @sakra pour remplacer la valeur par défaut des options du compilateur ressemble à une solution plus propre, permettant d'exercer un contrôle plus précis sur le réglage des options du compilateur.Quand je travaillais sur une réponse de cette question j'ai remarqué que
add_compile_options()
commande ne remplacer/écrase le niveau d'avertissement de la spécification au lieu de simplement en l'ajoutant à "Options Supplémentaires" comme quand vous ajoutez à CMAKE_CXX_FLAGS
. Je ne suis pas sûr de savoir pourquoi il y a une différence (à vérifier dans CMake du code), mais peut s'il vous plaît donner add_compile_options("/W4")
un essai? Dans mon CMake version 3.9, je n'ai pas eu cet avertissement du compilateur plus.add_compile_options("/W4")
me donne encore un avertissement du compilateur. Je suis à l'aide de la "Ninja"
générateur, à l'aide de la CMake soutien intégré de Visual Studio 2017 (15.3.3), il n'est pas .vcxproj généré le long de la route (autant que je sache). C'est à l'aide de cmake version 3.8.0-MSVC_2
.OriginalL'auteur IInspectable | 2017-09-01
Vous devez vous connecter pour publier un commentaire.
Les paramètres par défaut du compilateur sont ramassés à partir de module standard des fichiers situés dans le
Modules
répertoire de la CMake installation. La réelle fichier de module utilisé dépend à la fois de la plate-forme et le compilateur. E. g., pour Visual Studio 2017, CMake va charger les paramètres par défaut dans le fichierWindows-MSVC.cmake
et la langue de paramètres spécifiques d'Windows-MSVC-C.cmake
ouWindows-MSVC-CXX.cmake
.Pour inspecter les paramètres par défaut, créez un fichier
CompilerOptions.cmake
dans le répertoire du projet avec le contenu suivant:Ensuite initialiser le CMAKE_USER_MAKE_RULES_OVERRIDE variable dans votre
CMakeLists.txt
:Lorsque le projet est configuré lors de l'ouverture du répertoire dans Visual Studio 2017, les informations suivantes seront afficher dans l'IDE de la fenêtre de sortie:
Si l'avertissement de réglage de
/W3
est ramassé dans le CMake variableCMAKE_CXX_FLAGS_INIT
qui s'applique alors à tous CMake cibles générée par le projet.Pour contrôler le niveau d'avertissement sur le CMake projet ou le niveau de la cible, on peut modifier la
CMAKE_CXX_FLAGS_INIT
variable dans leCompilerOptions.cmake
en ajoutant les lignes suivantes dans le fichier:Le drapeau d'avertissement peut être contrôlé par le réglage de la cible options de compilation dans
CMakeLists.txt
:Pour la plupart des CMake projets il fait sens pour contrôler les options par défaut du compilateur dans un fichier de substitution au lieu de saisir manuellement le peaufinage des variables comme
CMAKE_CXX_FLAGS
.Lorsque vous apportez des modifications à la
CompilerOptions.cmake
fichier, il est nécessaire de recréer le dossier de création. Lors de l'utilisation de Visual Studio 2017 dansOpen Folder
mode, choisissez la commandeCache ... -> Delete Cache Folders
de laCMake
menu, puisCache ... -> Generate
de laCMake
menu de recréer le dossier de création.Regardez le code source 😉 CMake source contient des informations intéressantes dans les commentaires, ce qui malheureusement n'est pas disponible n'importe où d'autre, par exemple: github.com/Kitware/CMake/blob/...
Cela ne semble pas fonctionner dans VS2017 15.8. Pas de CMAKE_CXX_FLAGS_ est répertorié.
OriginalL'auteur sakra
En tournant mon commentaire en réponse
CMake ne viennent avec quelques commutateurs compilateur preset. Pour visual studio ceux-ci sont principalement norme bibliothèques de liens, les niveaux d'alerte, les niveaux d'optimisation, gestion des exceptions, les informations de débogage et de la plate-forme définit.
Ce que vous avez maintenant à faire la différence lorsque vous souhaitez modifier un CMake généré paramètres du compilateur sont les cas d'utilisation suivants:
Donc, nous allons discuter en commun des solutions pour ces cas.
Utilisateur modifie/ajoute de Projet/CMake Drapeaux du Compilateur par Défaut
À la norme serait de modifier le cache drapeaux de compilation des variables en utilisant les outils fournis avec CMake comme
cmake-gui
etccmake
.Pour atteindre cet objectif dans Visual Studio, vous devez:
CMake /Cache /View CMakeCache
Modifier manuellement par exemple
CMAKE_CXX_FLAGS
à/Wall
CMakeCache.txt
CMake /Cache /Generate
Ou vous programmez l'
CMAKE_CXX_FLAGS
cache variable par l'intermédiaire d'unCMakeSettings.json
fichier:CMake /Change CMake Settings
Force l'entrée du cache avec
-DCMAKE_CXX_FLAGS:STRING=...
danscmakeCommandArgs
CMakeSettings.json
Si vous livrer ce
CMakeSettings.json
fichier avec votre CMake projet, il devient permanentLes modifications du projet de CMake Drapeaux du Compilateur par Défaut
Si vous souhaitez conserver la plupart de CMake de drapeaux du compilateur en place, @sakra la réponse est certainement le chemin à parcourir.
Pour ma VS les projets que j'ai mis le CXX du pavillon des paramètres dans un fichier en provenance de la chaîne d'avec le projet lui-même. Principalement pour figer ces paramètres et ne pas avoir une dépendance de la version de CMake ou de toute variables d'environnement définies.
En prenant l'exemple ci-dessus qui pourrait ressembler à:
VS2017Toolchain.cmake
CMakeSettings.json
Références
CMAKE_TOOLCHAIN_FILE
variable est particulièrement intéressant, car il broches vers le bas à l'environnement, avec des valeurs fixes, permettant à ceux à être mis sous contrôle de code source. Pourtant, il se sent un peu comme un abus de ce de la chaîne d'fichiers sont destinés à être utilisés pour. Cela introduit des modifications à CMake du comportement (comme laCMAKE_USER_MAKE_RULES_OVERRIDE
variable) très tôt, avant de CMake construit son premier projet de test. Suis-je trop concerné, ou est-ce, en effet, ouvrir le potentiel pour des problèmes? (Je suis un CMake novice, et mon modèle mental de la façon dont CMake ouvrages peuvent être off.)Je préfère la chaîne d'approche aussi parce qu'il sépare les différents compilateur pré-réglages très bien et qui rend mon générique
CMakeLists.txt
fichiers de plus en plus lisible. Et pas de toolchains ne sont pas seulement pour la cross-compilation, mais vous pouvez également utiliser la-C
cache de pré-chargement option de ligne de commande (toolchains juste, ils ont l'avantage également se propager dans tous les projets de CMake peut générer à la volée). Et avoir les drapeaux dès le début a l'avantage que le compilateur vérifie (étape de configuration) échouerait si j'ai eu tort.OriginalL'auteur Florian