Projekt aufteilen
-
Ich hab mal eine allgemeine Frage zum Aufteilen eines Projekts in mehrere Dateien.
Wie sollte man das am besten machen.Sollte man die einzelnen Dateien in eine große main.cpp includen z.B.
#include "header.h" #include "client.cpp" #include "server.cpp" //client und server hat nichts zu bedeuten, mir ist nurnix besseres grad eingefalleOder sollte ich sie besser erst ebim combilieren zusammenfügen damit ich das ganze nachher in ne makefile zusammenfügen kann
g++ server.cpp client.cpp main.cppUnd wenn ja wie mach ich das dann mit den einzelnen funktionen?
Als extern Deklarieren?
Und dann in der main.cpp aufrufen?//server.cpp int extern online() { cout << "Server online" << endl; return 0; } //main .cpp int main() { online(); return 0; }Und noch zu guter letzt: Was mach ich dann mit den headern? in jede Datei einzeln includen oder wie?
Würde mich freuen wenn mir das einer kurz und anschaulich erklären könnte wie man das am besten macht mit dem Aufteilen eines Projekts.
Danke!
-
#include "client.cpp"ist erst mal grundlegend verkehrt. Würde zwar funktionieren, aber ist vom Konzept her falsch.
Jede Klasse erhält in der Regel eine Header- und eine Cpp-Datei Die Header nur wenn nötig inkludieren. Das Schüsselwort extern kannst Du mal vergessen. Das wird nur bei Variablen benötigt. In eine geeignete Header einfach einen Prototypen unterbringen und in einer Cpp-Datei definieren. Zum Compilieren jede Cpp-Datei einzeln compilieren und dann die Objekt-Dateien linken. Am besten geht das mit einem Makefile. Ein einfaches Makefile sieht etwa so aus:
meinprog: client.o server.oMake weiß, wie er von einer cpp-Datei auf eine .o-Datei und dann zu einem funktionierenden Programm kommt. Dann brauchst Du den Compiler und den Linker nicht explizit aufzurufen.
Gruß
Tommi
-
Die makefiles sind mir klar. Danke
Wenn ich dich richtig verstanden hab also etwa so:
//proto.h int online(); int offline(); //server #include "proto.h" int online() { cout << "Server online" << endl; return 0; } int offline() { cout << "Server offline" << endl; return 0; } //main.cpp #include "proto.h" int main() { online(); offline(); return0; }#makefile make: main.o server.o g++ -o server main.o server.o main.o: main.cpp g++ -c main.cpp server.o: server.cpp g++ -c server.cppUnd es reicht wenn man nur die prototypen angibt?

-
Ja so in etwa. Bis auf die fehlenden std::. Aber das wirst Du der kürze halber wohl weg gelassen haben.
Aber ich würde zu einer server.cpp genau eine server.h mit den entsprechenden Deklarationen machen. Und jede Header erhält die berühmnten include-guards.
Und ausserdem: Make hat einige eingebaute Regeln. Das läßt sich weit kürzer schreiben
also:
server.h:#ifndef SERVER_H #define SERVER_H int online(); int offline(); #endif // SERVER_Hserver.cpp:
#include "server.h" // Immer mit der zugehörigen Header-Datei anfangen. // das vermeidet vergessene Abhängigkeiten im Header. #include <iostream> int online() { std::cout << "Server online" << std::endl; return 0; } int offline() { std::cout << "Server offline" << std::endl; return 0; }main.cpp:
#include "server.h" int main(int argc, char* argv[]) { online(); offline(); return 0; }und noch das Makefile:
myprog: server.o main.o $(CXX) -o $@ $^Ein beherztes "make" und schon entsteht ein kleines Programm myprog, was sich mit ./myprog direkt ausführen läßt.
Tommi
-
Ok alles klar danke für die Hilfe
Zu dem maketeil kann ich nur sagen. Wow!

-
Hmm, mit SCons ist das einfacher und weitaus flexibler (auch ohne Python-Kenntnisse). Makefiles muten irgendwie vorsintflutlich an.