web-dev-qa-db-fra.com

VC2010 C++ - organisation des fichiers source

J'avais quelques questions sur la façon d'organiser les fichiers source dans un projet VC 2010 C++. Les filtres par défaut inclus ne seront pas suffisants car au final, je vais avoir beaucoup de fichiers .cpp et .hpp, donc ça va devenir compliqué. J'aimerais créer un dossier à la racine du projet appelé "source", puis créer des dossiers dans "source" pour les différentes catégories de fichiers source que je souhaite utiliser. Lorsque je clique avec le bouton droit sur la solution, je ne dispose que de la possibilité d’ajouter un filtre, pas un dossier. Je peux créer des dossiers manuellement dans l'Explorateur Windows, puis les inclure, mais je ne peux plus ajouter de filtres. Est-il possible d'ajouter de nouveaux dossiers (sans utiliser l'Explorateur Windows) tout en utilisant des filtres?

De plus, y a-t-il quelque chose de similaire à $ (CURDIR) que je pourrais utiliser pour inclure le dossier du fichier source sans avoir besoin d'un chemin absolu? 

Merci d'avance pour l'aide

61
Megatron

Vous êtes un peu confus quant à la façon dont Visual Studio fonctionne avec les fichiers C++, mais ce n'est pas grave, car la documentation est médiocre. Tout d’abord: à la différence de C # ou de Java, la disposition des fichiers dans le projet n’a aucun rapport avec la disposition des fichiers sur votre disque. Les fichiers et les dossiers ne sont pas "dans" le projet, vraiment; le projet ne répertorie que les noms et les chemins des fichiers et des dossiers, qui doivent déjà exister sur votre disque.

En général, vous créez la disposition des dossiers, avec les fichiers source à l'intérieur de ces dossiers. Vous faites ceci en dehors de de Visual Studio. Vous créez également un fichier de projet. Lorsque vous "ajoutez un fichier" au projet, il vous suffit d'indiquer au projet où trouver le fichier sur le disque.

Travaillons avec un exemple spécifique et je vais vous montrer comment je l'organiserais. Supposons que vous réalisiez un programme de calculateur graphique appelé SuperCalc. Vous aurez un dossier Source, puis créerez des dossiers dans Source pour contenir les différents fichiers. Supposons que les dossiers que vous créez sont:

  • SuperCalc\Source\Input
  • SuperCalc\Source\Math
  • SuperCalc\Source\Math\Matrix
  • SuperCalc\Source\Output

Vous avez 3 sous-répertoires de Source: Input, Output et Math. Le sous-répertoire Math a un sous-répertoire appelé Matrix. Vous aurez des fichiers .cpp en entrée, en mathématiques, en matrice et en sortie. Vous allez créer ces répertoires (dossiers) à l'aide de l'Explorateur Windows ou de l'invite de commande.

Maintenant, vous souhaiterez également créer un fichier de solution (SuperCalc.sln) et un fichier de projet (SuperCalc.vcxproj & SuperCalc.vcxproj.filters). Faites cela à l'intérieur de Visual Studio. Généralement, le fichier de projet réside dans un sous-dossier du répertoire de la solution. cela sera fait automatiquement pour vous par Visual Studio. Choisissez un emplacement pour le fichier de solution - il devrait figurer quelque part dans la même structure de répertoires (arborescence de dossiers) que le code source. Je suggérerais de le placer à côté du répertoire Source, dans:

  • SuperCalc\Build

Allez dans VS et sélectionnez File > New > Project > Visual Studio Solutions > Blank Solution File. Donnez à la solution un nom (peut-être "SuperCalc") et un emplacement (l’emplacement que nous venons de sélectionner dans le répertoire SuperCalc\Build]). Il créera le fichier de solution pour vous.

Maintenant, cliquez avec le bouton droit de la souris sur la solution dans l'explorateur de solutions ("Solution SuperCalc, 0 projets"), puis choisissez Add > New Project. Choisissez un nom - ce sera le nom de l'exécutable de votre programme, comme "SuperCalc"! Choisissez Win32, soit application console Win32 (programme-console DOS) ou projet Win32 (programme Windows classique). En général, je clique ensuite sur Paramètres de l'application pour apporter des modifications importantes: d'une part, je choisis Empty Project (Projet vide), car je ne souhaite pas que Visual Studio crée des fichiers et du code pour moi à moins que je ne le lui dise. Lorsque tout est configuré comme je le souhaite, je clique sur FINISH.

Vous avez maintenant votre fichier de solution et votre projet, créés par Visual Studio. Vous avez également votre code source, ou au moins la structure de répertoires (arborescence de dossiers) dans laquelle votre code source sera créé, en dehors de Visual Studio. Il est temps de relier les deux choses ensemble.

Si vous le souhaitez, vous pouvez répertorier tous vos fichiers source dans le filtre Fichiers sources de votre projet. Bien qu'ils proviennent de différents répertoires (Input, Matrix, etc.), il n'y a pas de relation requise entre les emplacements des fichiers sur le disque et leur apparence dans le projet. Mais si vous avez beaucoup de fichiers, il est plus facile de créer des "sous-filtres", des filtres dans le filtre Fichiers sources et de leur donner le nom des sous-dossiers de Source. Ainsi, vous répliquez la structure de vos répertoires de disque dans votre fichier de projet.

Cliquez avec le bouton droit de la souris sur le filtre Fichiers sources du projet "SuperCalc", puis choisissez Ajouter> Ajouter un nouveau filtre. Donnez-lui le nom Input (le premier des répertoires SuperCalc\Source). Créez également les filtres Math et Output. Cliquez avec le bouton droit sur le filtre Math, puis choisissez Ajouter> Ajouter un nouveau filtre pour créer un sous-filtre appelé Matrix (dans Math). Maintenant vous avez ces filtres :

 SuperCalc 
 Fichiers sources 
 Entrée 
 Maths 
 Matrice 
 Sortie 

qui est parallèle aux répertoires (dossiers) que vous avez créés précédemment. Ceci est purement un arrangement pratique pour les humains . Visual Studio ne comprend rien de spécial à ce sujet. Si vous dites simplement à VS "d'ajouter un fichier", le fichier ne sera pas placé dans le filtre approprié. Vous devrez dire où le mettre.

Pour ajouter ou créer vos fichiers .cpp, sélectionnez le nom du filtre correspondant au répertoire où se trouve le fichier .cpp. Ainsi, pour ajouter ou créer un fichier SuperCalc\Source\Math\Matrix\matrix_multiply.cpp, cliquez avec le bouton droit sur le filtre Matrix dans l'Explorateur de solutions, puis choisissez Ajouter> Ajouter un nouveau fichier ou Ajouter un fichier existant. (Ajouter un fichier existant est pour lorsque vous avez déjà écrit matrix_multiply.cpp et que vous voulez juste dire au projet où il se trouve.) Utilisez la boîte de dialogue pour accéder au répertoire Source\Math\Matrix. Répétez cette procédure pour tous les fichiers source de l’ensemble de votre programme.

Vous avez également posé la question "Y a-t-il quelque chose de similaire à $ (CURDIR) que je pourrais utiliser pour inclure le dossier du fichier source sans avoir besoin d'un chemin absolu?" Vous avez de la chance: les projets Visual Studio n'utilisent pas de chemins absolus! Ils utilisent des chemins relatifs. Le fichier de projet stocke le chemin relatif requis pour aller du répertoire contenant le fichier .vcxproj au répertoire contenant le fichier source. Donc, si vous avez créé SuperCalc.sln et SuperCalc.vcxproj où j'ai suggéré (le répertoire SuperCalc\Build) et que vous ajoutez vos fichiers .cpp dans les sous-répertoires source, vous pouvez aller voir à l'intérieur du fichier SuperCalc.vcxproj en utilisant le Bloc-notes, et vous verrez des lignes comme:

 <ClCompile Include = "..\..\..\Source\Math\Matrix\matrix_multiply.cpp" />

Comme il n’existe pas de chemins absolus, vous pouvez déplacer l’arborescence de répertoires SuperCalc dans son intégralité et la déplacer ailleurs, et tout fonctionnera toujours. Pas besoin de hacks de variables d'environnement comme $ (CURDIR).

Une dernière chose à savoir: puisque vous placez vos fichiers source dans plusieurs répertoires, vous pouvez avoir des problèmes avec les en-têtes #includeing, les fichiers .h ou .hpp. Vous devez indiquer au compilateur les répertoires où se trouvent vos fichiers d’en-tête. Ils seront probablement dispersés dans plusieurs annuaires. Modifiez donc les paramètres du projet: cliquez avec le bouton droit sur le nom du projet dans l'Explorateur de solutions, choisissez Propriétés, puis sélectionnez Propriétés de configuration> C/C++> Général. Le premier champ de la feuille de propriétés indique "Répertoires d'inclusion supplémentaires". Avant de faire quoi que ce soit , cliquez sur le menu déroulant Configuration et choisissez Toutes les configurations. Si vous avez une construction 32 bits et 64 bits, cliquez sur le menu déroulant Plate-forme et choisissez Toutes les plates-formes. Maintenant, allez dans les "Répertoires d'inclusion supplémentaires" et ajoutez tous les chemins d'accès à tous les répertoires sources, les chemins spécifiés étant relatifs au répertoire du fichier de projet. Donc, pour l'exemple SuperCalc, cela ressemblerait à:

 ..\..\..\Source\Entrée; ..\..\..\Source\Math; ..\..\..\Source\Math\Matrix; .. \. .\..\Source\Sortie 

Une fois cette modification effectuée, un fichier tel que Source\Math\Matrix\matrix_multiply.cpp peut avoir une ligne.

#include "input_configuration.hpp"

#include un fichier à partir du répertoire Input et cela fonctionnera parfaitement.

(Si tout ne fonctionne pas, l'approche habituelle consiste à revenir dans les propriétés du projet et à manipuler le nombre de séquences ..\ devant vos répertoires d'inclusion supplémentaires. Rappelez-vous chaque fois que vous apportez une modification, vous devez choisir à nouveau Toutes les configurations - sinon vos modifications ne s'appliqueront qu'à la configuration actuelle (débogage ou libération). le réglage est non collant .)

152
librik

Il est en fait IS possible d'afficher (et de manipuler) la structure de fichier physique via Visual Studio, comme décrit dans ce SO message :

L'en-tête/fichier source n'est pas une exigence imposée par Visual Studio . Ce n'est que la disposition par défaut, virtuelle et non physique. Si vous Cliquez sur "Afficher tous les fichiers" dans l'explorateur de la solution. Le fichier .__ apparaîtra. arborescence de dossiers telle qu’elle se trouve sur le disque dur, que vous pouvez manipuler en tant que vous voyez bon.

23
morgancodes

Je suis en retard, mais je déconseille la réponse acceptée. La raison principale si pour le code la portabilité . Au lieu de cela je recommande:

  1. Pour créer la disposition des dossiers et des sous-dossiers en dehors de Visual Studio (identique à la réponse acceptée mais les points suivants sont différents). Dans chaque sous-dossier, créez un dossier include et src
  2. Ensuite, dans Propriétés de configuration> C/C++> Général> "Répertoires d'inclusion supplémentaires" (pour toutes les configurations et toutes les plateformes), ajoutez un dossier single qui constitue la base de tous vos sous-dossiers.
  3. Pour vous ajouter des fichiers src et les inclure dans ces sous-dossiers.

  4. Enfin, incluez chaque fichier d’en-tête en utilisant parents chemins vers ce dossier de base. 

Pour être clair: si la disposition de votre projet est la suivante:

MyProjet
   Math
     include
       random.h
       functions.h
     src
       random.cpp
       functions.cpp
   Probability
      include
        normal.h
      src
        normal.cpp

vous devriez avoir dans functions.cpp l'instruction include suivante:

#include"Math/include/functions.h"

si vous devez également utiliser le code normal dans functions.cpp, le haut de functions.cpp devrait ressembler à ceci:

#include"Math/include/functions.h"
#include"Probability/include/normal.h"

Ce faisant, vous pourrez réutiliser votre sous-dossier Math dans un autre projet (B) sans peine: il vous suffit d'ajouter le dossier de base MyProject dans les "Répertoires d'inclusion supplémentaires" du projet B. 

Le point clé est d’avoir uniquement le dossier one base dans la propriété "Additional Include Directories".

ps: la fonctionnalité intellisense de VS 2015 aide beaucoup à écrire le #include...

1
Malick

L'utilisation d'un système de compilation tel que CMake ou Premake peut vous aider à organiser les fichiers. Elle présente également l'avantage de vous aider à transférer votre code sur d'autres plates-formes. Ici est une bonne présentation sur le sujet.

Comme cela pourrait être utile à quelqu'un, je devrais également ajouter que le fait de séparer vos fichiers source de votre fichier de projet (*.vcxproj) rend plus difficile la création de nouveaux fichiers, car Visual Studio souhaite créer par votre projet. La solution de contournement à ce problème que j'ai trouvé jusqu'à présent consiste à utiliser l'extension Visual Assists, car elle permet d'ajouter de nouveaux fichiers par rapport au répertoire ou à votre fichier actuellement ouvert. Voir this post pour plus d'explications.

0
Adelost