Question

Je travaille sur une bibliothèque C ++. En fin de compte, je voudrais le rendre accessible au public pour plusieurs plates-formes (Linux et Windows au moins), ainsi que quelques exemples et Python liaisons. Les travaux avancent bien, mais au moment où le projet est tout à fait désordonné, seul construit et pour visuelle C de et non multi-plateforme du tout.

Par conséquent, je me sens un nettoyage est en ordre. La première chose que je voudrais améliorer est la structure de répertoire du projet. Je voudrais créer une structure qui convient pour les outils de Automake du

J'ai essayé de Google pour des termes tels que « C ++ structure de répertoire bibliothèque », mais rien ne semble utile de venir. J'ai trouvé quelques lignes directrices très basiques, mais pas des solutions claires en cristal.

En regardant certaines bibliothèques open source, je suis venu avec ce qui suit:

\mylib
    \mylib <source files, read somewhere to avoid 'src' directory>
        \include? or just mix .cpp and .h
    \bin <compiled examples, where to put the sources?>
    \python <Python bindings stuff>
    \lib <compiled library>
    \projects <VC++ project files, .sln goes in project root?>
    \include? 
    README
    AUTHORS
    ...

Je n'ai pas / peu d'expérience avec le développement multi-plateforme / projets open source et je suis très étonné que je ne peux pas trouver de bonnes directives sur la façon de structurer un tel projet.

Comment doit-on structurer généralement un tel projet de bibliothèque? Qu'est-ce que ca recommander à lire? Y a-t-il des bons exemples?

Était-ce utile?

La solution

Une chose qui est très commun entre les bibliothèques Unix est qu'ils sont organisés de telle sorte que:

./         Makefile and configure scripts.
./src      General sources
./include  Header files that expose the public interface and are to be installed
./lib      Library build directory
./bin      Tools build directory
./tools    Tools sources
./test     Test suites that should be run during a `make test`

Il reflète un peu le système de fichiers Unix traditionnel sous /usr où:

/usr/src      Sometimes contains sources for installed programs
/usr/include  Default include directory
/usr/lib      Standard library install path
/usr/share/projectname   Contains files specific to the project.

Bien sûr, ceux-ci peuvent se retrouver dans /usr/local (qui est le préfixe d'installation par défaut pour GNU autoconf), et ils ne peuvent pas adhérer à cette structure du tout.

Il n'y a pas de règle stricte et rapide. Personnellement, je n'organise pas les choses de cette façon. (J'éviter d'utiliser un répertoire ./src/ du tout, sauf pour les plus grands projets, par exemple. Je n'utilise aussi autotools, préférant à la place CMake.)

Ma suggestion pour vous est que vous devez choisir une mise en page de répertoire a du sens pour vous (et votre équipe). Faites tout ce qui est le plus judicieux pour votre environnement de développement choisi, construire des outils et le contrôle de la source.

Autres conseils

Je ne pense pas qu'il y ait vraiment de bonnes directives pour cela. La majeure partie est tout simplement la préférence personnelle. Certains années IDE détermineront une structure de base pour vous, cependant. Visual Studio, par exemple, va créer un dossier bin séparé qui est divisé en un débogage et Release sous-dossiers. Dans VS, cela a un sens quand vous compilez votre code en utilisant des cibles différentes. (Mode débogage, le mode de sortie.)

Comme dit greyfade, utilisez une mise en page qui fait sens pour vous. Si quelqu'un d'autre ne l'aime pas, ils auront juste pour restructurer eux-mêmes. Heureusement, la plupart des utilisateurs seront satisfaits de la structure que vous avez choisi. (À moins qu'il est vrai désordre.)

Il y a cette convention impressionnante que je suis récemment tombé sur qui pourrait être utile: La mise en page Pitchfork (également sur GitHub ).

Pour résumer, le paragraphe 1.3 indique que:

  

PFL prescrit plusieurs répertoires qui doivent apparaître à la racine de l'arborescence du projet. Pas tous les répertoires sont nécessaires, mais ils ont un but assigné, et aucun autre répertoire dans le système de fichiers peut assumer le rôle d'un de ces répertoires. Autrement dit, ces répertoires doivent être ceux utilisés si leur but est nécessaire.

     

D'autres répertoires ne doivent pas apparaître à la racine.

     

build/: Un répertoire spécial qui ne devrait pas être considérée comme faisant partie de la source du projet. Utilisé pour stocker les résultats de la construction éphémère. ne doit pas être vérifiée dans le contrôle source. Si vous utilisez le contrôle source, doit être ignorée à l'aide d'ignorer les listes de contrôle-source.

     

src/: source principale emplacement compilable. Doit être présent pour des projets avec des composants compilés qui n'utilisent pas sous-modules.   En présence de include/, contient également des en-têtes privées.

     

include/: Répertoire des en-têtes publics. Peut être présent. Peut être omis pour des projets qui ne font pas la distinction entre les en-têtes privés / publics. Peut être omis pour des projets qui utilisent des sous-modules.

     

tests/. Répertoire des tests

     

examples/. Répertoire des échantillons et des exemples

     

external/. Répertoire des paquets / projets à utiliser par le projet, mais pas modifié dans le cadre du projet

     

extras/. Répertoire contenant des sous-modules supplémentaires / option pour le projet

     

data/: Répertoire contenant aspects de code non-source du projet. Cela pourrait inclure des graphiques et des fichiers de marquage.

     

tools/: Répertoire contenant les services publics de développement, tels que les scripts de compilation et refactoring

     

docs/. Répertoire de la documentation du projet

     

libs/. Répertoire des sous-modules principaux du projet

En outre, je pense que le répertoire est extras/ où vos liaisons Python devraient aller .

Je recommande vraiment vous en utilisant CMake ... il est pour le développement multi-plateforme et il est beaucoup plus souple que automake, utilisez CMake et vous serez en mesure d'écrire du code multi-plateforme avec votre propre structure direcory sur tous les systèmes.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top