Utilisation de CMake pour générer des fichiers de projet Visual Studio C ++

91

Je travaille sur un projet C ++ open source, pour du code qui se compile sous Linux et Windows. J'utilise CMake pour construire le code sous Linux. Pour faciliter la configuration du développement et des raisons politiques, je dois m'en tenir aux fichiers de projet / éditeur Visual Studio sous Windows (je ne peux pas basculer vers Code :: Blocks , par exemple). Je vois des instructions pour générer des fichiers Visual Studio à l'aide de CMake, comme ici .

Avez-vous déjà utilisé CMake pour générer des fichiers Visual Studio? Quelle a été votre expérience? Supposons que je veuille ajouter un nouveau fichier à mon projet. Quel est le flux de travail pour cela?

amit
la source
1
Pour ceux dans GNU + Linux qui essaient de générer des fichiers de projet pour Visual Studio, qui est spécifique à Windows, gardez cette réponse à l'esprit. TL; DR: les générateurs sont spécifiques à la plate-forme et vous devez être sous Windows pour le faire.
code_dredd

Réponses:

57

CMake est en fait assez bon pour cela. L'élément clé était que tout le monde du côté Windows devait se rappeler d'exécuter CMake avant de charger la solution, et tout le monde de notre côté Mac devrait se rappeler de l'exécuter avant de faire.

La partie la plus difficile était en tant que développeur Windows de s'assurer que vos modifications structurelles étaient dans le fichier cmakelist.txt et non dans les fichiers de solution ou de projet, car ces modifications seraient probablement perdues et même si elles n'étaient pas perdues, elles ne seraient pas transférées du côté Mac qui en avait également besoin, et les gars de Mac devraient se souvenir de ne pas modifier le fichier de création pour les mêmes raisons.

Cela demande juste un peu de réflexion et de patience, mais il y aura des erreurs au début. Mais si vous utilisez l'intégration continue des deux côtés, celles-ci seront ébranlées tôt et les gens finiront par prendre l'habitude.

Alex
la source
11
Si c'était vrai une fois, ce n'est plus le cas. Toute modification apportée à CMakeLists.txt entraînera une régénération du système de construction (fichiers de projet pour Visual Studio, makefiles, etc.). Le flux de travail dans Visual Studio est un peu ennuyeux car Visual Studio ne régénère pas les fichiers du projet lorsqu'il détecte que les choses ont changé, mais attend à la place que vous fassiez une génération qui fait apparaître une boîte de dialogue car la génération doit être abandonnée pour re -charger le fichier projet.
Vitali
1
La mise en garde à cela est que vous n'avez pas à exécuter le compilateur Visual Studio via l'EDI. Vous pouvez l'exécuter sur la ligne de commande:C:\...> MSBuild ALL_BUILD.vcxproj
PfunnyGuy
2
@PfunnyGuy Voir aussi cmake --build ..
detly le
@detly merci! En fait, j'ai trouvé ça et j'utilise cmake --build . --config Debug -- /nologo /verbosity:minimal /m. . target run_testsJ'insérerai après pour exécuter mon test unitaire googletest, et "Debug" peut être remplacé par "Release". (L'ajout de l'option de configuration pour le débogage est facultatif, car c'est la valeur par défaut, mais je l'ai inclus pour montrer comment il peut être échangé avec "Release")
PfunnyGuy
47

Je ne sais pas si c'est directement lié à la question, mais je cherchais une réponse pour savoir comment générer * .sln à partir de projets cmake.J'ai découvert que l'on pouvait utiliser quelque chose comme ceci:

cmake -G "Visual Studio 10"

L'exemple génère les fichiers VS 2010 nécessaires à partir d'un fichier CMakeLists.txt d'entrée

Ghita
la source
1
Sur stackoverflow.com/questions/11269833/... @Ivan souligne que cela peut être placé dans un fichier PreLoad.cmake dans le même dossier que votre CMakeLists.txt de niveau supérieur et que vous pouvez simplement le faire cmake.
PfunnyGuy
25

Nous avons déplacé la chaîne de construction de notre département vers CMake, et nous avons eu quelques roadbumps internes depuis que d'autres départements utilisaient nos fichiers de projet et étaient habitués à simplement les importer dans leurs solutions. Nous avons également eu quelques plaintes concernant CMake n'étant pas entièrement intégré dans le gestionnaire de projet / solution Visual Studio, donc les fichiers ont dû être ajoutés manuellement à CMakeLists.txt; c'était une rupture majeure dans le flux de travail auquel les gens étaient habitués.

Mais en général, c'était une transition assez douce. Nous sommes très heureux car nous n'avons plus à gérer les fichiers de projet.

Le flux de travail concret pour ajouter un nouveau fichier à un projet est vraiment simple:

  1. Créez le fichier, assurez-vous qu'il est au bon endroit.
  2. Ajoutez le fichier à CMakeLists.txt.
  3. Construire.

CMake 2.6 se réexécute automatiquement si des fichiers CMakeLists.txt ont changé (et (semi-) recharge automatiquement la solution / les projets).

N'oubliez pas que si vous effectuez des builds hors source, vous devez faire attention à ne pas créer le fichier source dans le répertoire de build (puisque Visual Studio ne connaît que le répertoire de build).

JesperE
la source
9

Comme le dit Alex, cela fonctionne très bien. La seule partie délicate est de ne pas oublier d'apporter des modifications aux fichiers cmake, plutôt qu'à partir de Visual Studio. Ainsi, sur toutes les plates-formes, le flux de travail est similaire à celui utilisé si vous aviez utilisé d'anciens fichiers makefiles.

Mais il est assez facile de travailler avec, et je n'ai eu aucun problème avec cmake générant des fichiers invalides ou quelque chose comme ça, donc je ne m'inquiéterais pas trop.

jalf
la source
7

CMake produit des projets et des solutions Visual Studio de manière transparente. Vous pouvez même produire des projets / solutions pour différentes versions de Visual Studio sans apporter de modifications aux fichiers CMake.

L'ajout et la suppression de fichiers source consistent simplement à modifier le CMakeLists.txtqui contient la liste des fichiers sources et à régénérer les projets / solutions. Il existe même une fonction de globbing pour trouver toutes les sources dans un répertoire (bien qu'elle doive être utilisée avec précaution).

Le lien suivant explique très bien le comportement spécifique de CMake et de Visual Studio.

CMake et Visual Studio

ap-osd
la source
Ce lien et son exemple de projet sont très, très utiles, merci pour cela! Je recommanderais d'incorporer une partie du code source du repo github dans votre réponse, par exemple en mentionnant qu'un projet CMake est l'équivalent d'une solution et que quelque chose comme add_executable est utilisé pour ajouter l'équivalent d'un projet de studio visuel.
jrh
5

CMake peut générer un très joli Visual Studio .projs/ .slns, mais il y a toujours le problème avec la nécessité de modifier les .cmakefichiers plutôt que .proj/ .sln. Tel qu'il est actuellement, nous le traitons comme suit:

  1. Tous les fichiers source vont /srcet les fichiers visibles dans Visual Studio ne sont que des «liens» vers ceux définis dans .filter.
  2. Le programmeur ajoute / supprime les fichiers en se souvenant de travailler sur le /srcrépertoire défini , pas celui du projet par défaut.
  3. Quand il a terminé, il lance un script qui "rafraîchit" les .cmakefichiers respectifs .
  4. Il vérifie si le code peut être construit dans l'environnement recréé.
  5. Il valide le code.

Au début, nous avions un peu peur de la façon dont cela allait se passer, mais le flux de travail fonctionne très bien et avec de jolis diff visibles avant chaque commit, tout le monde peut facilement voir si ses modifications ont été correctement mappées dans les .cmakefichiers.

Une autre chose importante à savoir est le manque de soutien ( afaik ) pour les «Configurations de solution» dans CMake. En l'état, vous devez générer deux répertoires avec des projets / solutions - un pour chaque type de construction (debug, release, etc.). Il n'y a pas de support direct pour des fonctionnalités plus sophistiquées - en d'autres termes: basculer entre les configurations ne vous donnera pas ce à quoi vous pourriez vous attendre.

Rouge XIII
la source
4
À partir de CMake 2.8.10, les solutions générées ont les 4 configurations de construction habituelles, et il existe un support pour définir des configurations personnalisées supplémentaires.
John
0

J'ai commencé mon propre projet, appelé syncProj. Liens de documentation / téléchargement à partir d'ici:

https://docs.google.com/document/d/1C1YrbFUVpTBXajbtrC62aXru2om6dy5rClyknBj5zHU/edit# https://sourceforge.net/projects/syncproj/

Si vous envisagez d'utiliser Visual studio pour le développement et que seul C ++ est actuellement pris en charge.

Le principal avantage par rapport aux autres systèmes de marque est que vous pouvez réellement déboguer votre script, car il est basé sur C #.

Si vous n'êtes pas familier avec syncProj, vous pouvez simplement convertir votre solution / projet en script .cs et poursuivre le développement à partir de là.

Dans cmake, vous devrez tout écrire à partir de zéro.

TarmoPikaro
la source