[Visual C++ 2008] Mehrere Cpp-Dateien in einem Projekt



  • In meinem Projekt brauche ich viele .cpp Dateien, die im VS Dateiexplorer unter "Source Files" stehen. Allerdings kann ich das Projekt dann nicht kompilieren, weil scheinbar jede Datei einzeln kompiliert wird. Beispiel:

    Datei1.cpp:
    #include <windows.h>
    #include "Datei2.cpp"

    Datei2.cpp
    CreateWindowEx

    Den Bezeichner CreateWindowEx kann er nicht finden. Wie kann ich es anstellen, dass ich eine "Hauptdatei" habe und nicht alles einzeln kompiliert wird?



  • Ich verstehe zwar dein Problem nicht ganz, aber allgemein kann man sagen:
    1.) Nur Header Files werden inkludiert (kein CPP oder C)

    2.)

    weil scheinbar jede Datei einzeln kompiliert wird

    Das muss so sein.

    3.) Mache dich mit der Thematik von Header Guards vertraut (auch wenn das jetzt nicht explizit falsch in deinem Post steht).



  • Danke erstmal für deine Antwort.
    Mein Beispiel war zugegeben etwas schlecht. Hier ein besseres:

    Meine Hauptdatei heißt "main.cpp" und ich will die Implementation eines Autos einfügen:

    // main.cpp
    
    #include <windows.h>
    #include "auto.h"
    

    In der "auto.h" wird "auto.cpp" eingefügt.

    // auto.h
    
    class Auto
    {
         // ...
    }
    
    #include "auto.cpp"
    

    Und in "auto.cpp" letztendlich die eigentliche Implementation der Methoden:

    // auto.cpp
    
    void Auto::Bremsen( )
    {
          MessageBoxA( 0, 0, "Ich bremse!", 0 );
    }
    

    Und beim Kompilieren wird nun gemeldet, dass MessageBoxA unbekannt sei. Ich möchte ja eigentlich nur main.cpp kompilieren, weil der Rest des Programms ja per #include eingefügt wird.

    Mit Include Gards hab ich's auch versucht, aber der Fehler, dass Funktionen, Strukturen usw., die in main.cpp eingefügt wurden, in auto.cpp nicht gefunden werden, bleibt. 😞



  • Hallo

    Wie Simon bereist geschrieben hat, werden nur Headerfiles (.h oder .hpp) inkludiert, keine Sourcefiles (.c oder .cpp)

    chrische



  • Aber wie bekomm ich dann .cpp Dateien in mein Projekt rein? Soll alles in die Header?



  • Hallo

    Nein. In der .cpp Dateien inkludierst du die entsprechende .h Datei und diese .h Datei wird dann dort inkludiert, wo du sie brauchst.

    chrische



  • Tut mir leid, wenn ich mich etwas blöd anstelle, aber
    ich soll also auch die Implementation für "Auto" in die .h Datei schreiben?
    Somit wäre main.cpp die einzige .cpp Datei in meinem Projekt?



  • Hallo

    Nein. Du machst eine Auto.h und eine Auto.cpp für die Implementation. In die Auto.cpp inkludierst du Auto.h. In die main.cpp inkludierst du ebenso die Auto.h.

    chrische



  • chrische5 schrieb:

    Wie Simon bereist geschrieben hat, werden nur Headerfiles (.h oder .hpp) inkludiert, keine Sourcefiles (.c oder .cpp)

    Das ist zumindest eine gute Richtlinie. Machen kannst Du natürlich was Du willst...



  • Moin

    wer meint cpp dateien includieren zu müssen, es gibt den schalter exclude from build. datei in der IDE auswählen, und linke maustaste unter einstellungen. ( dort wo man auch Dateispezifische compiler parameter einstellen kann)

    Vileicht noch mal ganz von vorn.

    *.c *.cpp:
    Implementierung von Funktionen und classen.

    *.h *.hpp:
    vordefinierungen / prototypen von funktionen und classen. Wird benötigt, damit der compiler mit in der c/c99-Datei implementierten Funktionen und classen umgehen kann. bzw. der C / CPP compiler ist relative dumm, er geht von oben nach unten durch, alles was er bisher an Klassen definitionen und funktionen nicht gesehen hat, kennt er nicht.

    Compiler:
    Übersetzt die C/Cpp - Dateien in obj dateien. Je übersetzungseinheit (c/cpp-datei) ist es nicht erforderlich, das für alle verwendeten funktionen und klassen die implementierung enthalten ist. es genügt, wenn die Beschreibung vorhanden ist. Es ist auch nicht aufgabe des Compilers, die Adressen für funktionen, Methoden, Variablen, ... zu definieren. Er erzeugt einen löchrigen maschinen code, in denen fast sämtliche addressen fehelen. für addressen, trägt er statdessen platzhalter ein, die dann zu einem späteren zeitpunkt im übersetzungsvorgang eingetragen werden.

    Linker:
    der linker generiert aus den einzelnen OBJ dateien ein ausführbares programm. Erst hier wird entschieden, an welche speicherzelle welche funktion, Methode, Variable, element plaziert wird. Erst jetzt ist es möglich die addressen eindeutig zu definieren. Hauptaufgabe des linkers ist es daher die platzhalter durch die jetzt festgelegten addressen zu ersetzen, und das ganze zu einem ausführbaren programm zusammen zu schnüren.

    gruss



  • Ich hab die #include Direktive bisher nicht ganz richtig interpretiert, aber jetzt ist alles klar.
    Danke an alle für die Hilfe. 🙂


Anmelden zum Antworten