2010-08-14 1 views
5

Ich bin ein Java-Entwickler und ich muss mich nie darum sorgen, Dateien einzuschließen oder mit BUILD-Dateien zu verfahren.Wie kommen Sie in C++ - Verknüpfungen/Abhängigkeiten?

Immer wenn ich C++ Code schreiben muss, werden die Dinge komplizierter. Ich kann daran denken, * .h-Dateien als Schnittstellen in Java zu erstellen, aber herauszufinden, wie man die Build-Datei schreibt und welche Ordnungsklassen enthalten sein sollten, bereitet mir Kopfschmerzen.

Gibt es eine einfache Möglichkeit, darüber nachzudenken? Woher weißt du, wann du etwas hinzufügen oder Dinge richtig trennen musst? Zum Beispiel, was ist im Allgemeinen ein guter Weg, um mit einem Projekt mit Dutzenden von Quellen Dateien umzugehen, die voneinander abhängig sind.

Gibt es ein Framework, das das Erstellen von BUILD-Dateien oder das Verwalten all dieser Boilerplate-Kompilierungsdateien erträglicher macht?

+0

Auf welcher Plattform sind Sie tätig? Was meinst du mit BUILD-Dateien? Meinst du Implementierungsdateien (wo Funktionsdefinitionen liegen) oder die Datei, die der Compiler für Switches, Includes, Bibliothekspfade und so Zeug liest? – dirkgently

+1

Ist das was du schwer findest? g ++ -c Einheit1.c -I/include_path/ ; g ++ -o ausführbare Datei * .o -L/library_path/ – LatinSuD

+0

Was sind Build-Dateien? Und was bedenken Sie mit "welche Ordnung Klassen enthalten sein sollten gibt mir Kopfschmerzen.". Build-Dateien oder enthält in der h/cpp? –

Antwort

8

CMake ist das beste Build-System, das ich bisher finden konnte. Sie geben ihm eine Liste Ihrer Quelldateien und werden automatisch Abhängigkeiten überprüfen und nur geänderte Dateien neu kompilieren. Obwohl die Syntax ein wenig witzig ist und die Dokumentation nicht sehr zugänglich ist, schlägt CMake die GNU-Autotools in Benutzerfreundlichkeit und Einfachheit und funktioniert auf allen wichtigen Plattformen.

In Bezug auf Ihr "geistiges Modell", was hier vor sich geht, sind hier einige Punkte zu beachten.

  • Eine .cpp Datei ist vollständig unabhängig von anderen .cpp Dateien kompiliert.

  • Die Datei wird vom Compiler nur einmal von oben nach unten gelesen. Daher müssen die Dinge in der richtigen Reihenfolge sein.

  • Eine #include Direktive ist die gleiche wie Kopieren/Einfügen der Kopfzeile in die .cpp Datei.

  • An der Stelle, wo eine Funktion verwendet wird, eine Erklärung dieser Funktion benötigt wird, aber nicht unbedingt eine Definition.

  • An der Stelle, an der auf ein Klassenmitglied zugegriffen wird, wird eine Definition der Klasse benötigt. Das Ableiten von einer Klasse erfordert auch ihre Definition. Die Verwendung von Zeigern oder Referenzen erfordert keine Definition, erfordert jedoch eine Deklaration. Verwenden Sie dies zu Ihrem Vorteil in den Überschriften: anstatt Foo.hpp einzuschließen, sehen Sie, ob Sie mit nur einer Erklärung von class Foo; davonkommen können.

  • Wenn eine .cpp Datei zu kompilieren, eine .o Datei erzeugt, die die Umsetzung der genau diese Funktionen enthält im .cpp definiert. Verweise auf Funktionen, die darin nicht definiert sind, bleiben dem Linker überlassen.

  • Der Linker fügt alle diese Definitionen in eine ausführbare Datei zusammen, aber jede Funktionsdefinition muss genau einmal vorhanden sein. (Templates und Inline-Funktionen sind eine Ausnahme.)

1

Ich bin ein großer Fan von Stackoverflow Podcast und ich habe beschlossen, dass, wenn ich ein Build-System verwenden würde, wenn ich verwende Finalbuilder.

Jeff Atwood und Joel Spolsky hatten ein Gespräch darüber und es wird erwähnt, dass es in Fog Creek verwendet wird.

Der Podcast ist here

Finalbuilder ist here

Feature Tour

Ich hoffe, es für den Zweck geeignet ist.

Es funktioniert auf der Windows-Plattform.