Verzeichnisstruktur für eine C ++ - Bibliothek


80

Ich arbeite an einer C ++ - Bibliothek. Letztendlich möchte ich es zusammen mit einigen Beispielen und Python- Bindungen für mehrere Plattformen (mindestens Linux und Windows) öffentlich verfügbar machen . Die Arbeit schreitet gut voran, aber im Moment ist das Projekt ziemlich chaotisch, nur in und für Visual C ++ integriert und überhaupt nicht plattformübergreifend.

Daher halte ich eine Bereinigung für angebracht. Das erste, was ich verbessern möchte, ist die Verzeichnisstruktur des Projekts. Ich möchte eine Struktur erstellen, die für die Automake- Tools geeignet ist, um eine einfache Kompilierung auf mehreren Plattformen zu ermöglichen, aber ich habe diese noch nie zuvor verwendet. Da ich (den größten Teil) noch in Visual Studio codiere, muss ich auch irgendwo meine Visual Studio-Projekt- und Lösungsdateien aufbewahren.

Ich habe versucht, nach Begriffen wie "C ++ - Bibliotheksverzeichnisstruktur" zu googeln, aber es scheint nichts Nützliches zu kommen. Ich habe einige sehr grundlegende Richtlinien gefunden, aber keine kristallklaren Lösungen.

Beim Betrachten einiger Open-Source-Bibliotheken habe ich Folgendes festgestellt:

\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
    ...

Ich habe keine / wenig Erfahrung mit Multi-Plattform-Entwicklung / Open Source-Projekten und bin ziemlich erstaunt, dass ich keine guten Richtlinien für die Strukturierung eines solchen Projekts finden kann.

Wie soll man ein solches Bibliotheksprojekt generell strukturieren? Was kann zum Lesen empfohlen werden? Gibt es einige gute Beispiele?


Antworten:


104

Eine Sache, die unter Unix-Bibliotheken sehr häufig vorkommt, ist, dass sie so organisiert sind, dass:

./         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`

Es spiegelt etwas das traditionelle Unix-Dateisystem wider, unter /usrdem:

/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.

Natürlich können diese in enden /usr/local(dies ist das Standardinstallationspräfix für GNU autoconf), und sie halten sich möglicherweise überhaupt nicht an diese Struktur.

Es gibt keine feste Regel. Ich persönlich organisiere die Dinge nicht so. (Ich vermeide es überhaupt, ein ./src/Verzeichnis zu verwenden, außer zum Beispiel für die größten Projekte. Ich verwende auch keine Autotools, sondern CMake.)

Mein Vorschlag an Sie ist, dass Sie ein Verzeichnislayout wählen, das für Sie (und Ihr Team) sinnvoll ist . Tun Sie, was für die von Ihnen gewählte Entwicklungsumgebung am sinnvollsten ist, erstellen Sie Tools und die Quellcodeverwaltung.


3
Bei Verwendung von CMake scheint ein Out-of-Source-Build großartig zu sein.
Korchkidu

11

Es gibt diese großartige Konvention, auf die ich kürzlich gestoßen bin und die hilfreich sein könnte: Das Pitchfork-Layout (auch auf GitHub ).

Zusammenfassend heißt es in Unterabschnitt 1.3 :

PFL schreibt mehrere Verzeichnisse vor, die im Stammverzeichnis des Projektbaums angezeigt werden sollen. Nicht alle Verzeichnisse sind erforderlich, aber sie haben einen zugewiesenen Zweck, und kein anderes Verzeichnis im Dateisystem darf die Rolle eines dieser Verzeichnisse übernehmen. Das heißt, diese Verzeichnisse müssen diejenigen sein, die verwendet werden, wenn ihr Zweck erforderlich ist.

Andere Verzeichnisse sollten nicht im Stammverzeichnis angezeigt werden.

build/: Ein spezielles Verzeichnis, das nicht als Teil der Projektquelle betrachtet werden sollte. Wird zum Speichern kurzlebiger Build-Ergebnisse verwendet. darf nicht in die Quellcodeverwaltung eingecheckt werden. Wenn Sie die Quellcodeverwaltung verwenden, müssen Sie diese mithilfe der Ignorierlisten der Quellcodeverwaltung ignorieren.

src/: Hauptkompilierbarer Quellspeicherort. Muss für Projekte mit kompilierten Komponenten vorhanden sein, die keine Submodule verwenden. In Gegenwart von include/enthält auch private Header.

include/: Verzeichnis für öffentliche Header. Kann vorhanden sein. Kann für Projekte weggelassen werden, die nicht zwischen privaten und öffentlichen Headern unterscheiden. Kann bei Projekten mit Submodulen weggelassen werden.

tests/: Verzeichnis für Tests.

examples/: Verzeichnis für Beispiele und Beispiele.

external/: Verzeichnis für Pakete / Projekte, die vom Projekt verwendet, aber nicht als Teil des Projekts bearbeitet werden sollen.

extras/: Verzeichnis mit zusätzlichen / optionalen Submodulen für das Projekt.

data/: Verzeichnis mit Nicht-Quellcode-Aspekten des Projekts. Dies kann Grafiken und Markup-Dateien umfassen.

tools/: Verzeichnis mit Entwicklungsdienstprogrammen wie Build- und Refactoring-Skripten

docs/: Verzeichnis für Projektdokumentation.

libs/: Verzeichnis für Hauptprojekt-Submodule.

Darüber hinaus denke ich, dass das extras/Verzeichnis ist, wo Ihre Python-Bindungen gehen sollten .


4

Ich glaube nicht, dass es dafür gute Richtlinien gibt. Das meiste davon ist nur eine persönliche Präferenz. Bestimmte IDEs bestimmen jedoch eine Grundstruktur für Sie. Visual Studio erstellt beispielsweise einen separaten Bin-Ordner, der in einen Debug- und einen Release-Unterordner unterteilt ist. In VS ist dies sinnvoll, wenn Sie Ihren Code mit verschiedenen Zielen kompilieren. (Debug-Modus, Release-Modus.)

Verwenden Sie, wie greyfade sagt, ein Layout, das für Sie sinnvoll ist. Wenn es jemand anderem nicht gefällt, muss er es einfach selbst umstrukturieren. Glücklicherweise werden die meisten Benutzer mit der von Ihnen gewählten Struktur zufrieden sein. (Es sei denn, es ist wirklich chaotisch.)



-1

Ich kann Ihnen wirklich empfehlen, CMake zu verwenden ... es ist für die plattformübergreifende Entwicklung gedacht und viel flexibler als Automake. Verwenden Sie CMake, und Sie können plattformübergreifenden Code mit Ihrer eigenen Verzeichnisstruktur auf allen Systemen schreiben.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.