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 eingefalle
    

    Oder 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.cpp
    

    Und 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.o
    

    Make 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.cpp
    

    Und 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_H
    

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


Anmelden zum Antworten