zwei ".cpp" Dateien in einem Projekt?



  • Hallo,

    Wollte mal was testen, wie ich 2 CPP Dateien zusammen binden...

    In der ersten Datei steht als Beispiel:

    #include <iostream.h>
    
    void schreibe(char* text)
    {
       cout << text << endl;
    }
    

    Die 2. Datei (Haupt Datei (MAIN) enthält...

    #include "c:\temp\temp\temp2.cpp" // Das funktioniert nicht so wie ich es wollte...
    
    void main ()							
    {
      schreibe("Hallo");
    }
    

    Alles in einer Datei funktioniert!

    Bekomme leider diesen Error Code:
    temp2.obj : error LNK2005: "void __cdecl schreibe(char *)" (?schreibe@@YAXPAD@Z) bereits in tesmp.obj definiert
    Debug/temp.exe : fatal error LNK1169: Ein oder mehrere mehrfach definierte Symbole gefunden
    Error executing link.exe.

    temp.exe - 2 error(s), 0 warning(s)

    Gruss,
    Cyrill



  • hast du womöglich in der projektdatei die obere CPP datei noch miteingebunden?
    dann steht sie nämlich doppelt drin.



  • In Visual Studio C++ 6 steht sie unter source schon mit drin! Aber wie rufe ich die Datei dann vor der main auf?



  • Aber wie rufe ich die Datei dann vor der main auf?

    Also Dateien ruft man hier eigentlich überhaupt nicht auf.

    DragonShaolin schrieb:

    Hallo,

    #include <iostream.h>
    
    void schreibe(char* text)
    {
       cout << text << endl;
    }
    

    Das ist käse, da für schreibe keine Funktionsdeklaration existiert. schreibe ist zwar extern sichtbar, aber aufgrund der fehlenden Deklaration nicht ohne weiteres verwendbar.

    DragonShaolin schrieb:

    #include "c:\temp\temp\temp2.cpp" // Das funktioniert nicht so wie ich es wollte...
    
    void main ()							
    {
      schreibe("Hallo");
    }
    

    Das ist gleich dreifacher Käse.
    1. Werden cpp-Dateien *niemals* inkludiert.
    2. Ist die absolute Pfadangabe sehr unglücklich. Dazu noch die Backslashes.
    3. gibt es kein void main.

    Bekomme leider diesen Error Code:
    temp2.obj : error LNK2005: "void __cdecl schreibe(char *)" (?schreibe@@YAXPAD@Z) bereits in tesmp.obj definiert
    Debug/temp.exe : fatal error LNK1169: Ein oder mehrere mehrfach definierte Symbole gefunden
    Error executing link.exe.

    Dieser Linker-Fehler beschreibt doch das Problem sehr deutlich.
    Einmal hast du eine Definition einer Funktion schreibe mit external linkage in der Datei temp2.cpp. Die wird übersetzt und erzeugt externe Symbole.

    Dann hast du eine main.cpp, welche *vor* der Übersetzung die temp2.cpp inkludiert. main.cpp enthält also ebenfalls eine Definition einer Funktion schreibe mit external linkage. Wird main übersetzt, erzeugt dies wiederum externe Symbole.

    Beim Linken stellt der Linker dann fest, dass es zwei Definitionen für schreibe gibt -> Error.

    Lösung:
    1. Erzeuge eine h-Datei mit der Funktionsdeklaration für schreibe.
    2. Inkludiere in temp2.cpp die neu erzeugte h-Datei und definiere schreibe
    3. Inkludiere in main.cpp die neu erzeugte h-Datei
    4. Übersetze main.cpp und temp2.cpp
    5. Linke main.o und temp2.o zusammen.
    6. Fertig.

    Beim VC erreichst du die Schritte 4-6 indem du beide cpp-Dateien zum Projekt hinzufügst.



  • Vielen Dank für deine Antwort. Ist schwerer als ich gedacht habe. Vielleicht sollte ich ein wenig später solche Sache probieren und mich noch ein wenig mit der Programmierung von C++ auseinandersetzen.

    Trotzdem vielen Dank!



  • Doch nicht so schwer habe gerade eine Header Datei erzeugt (Datei/Neu/Header Datei erzeugen), diese habe ich wirderum in meiner .cpp Datei includiert. Jetzt funktionierts!



  • in der .h ist auch ein Schutz gegen mehrfaches includen/deklarieren gut:

    #ifndef name_von_der_h_file
    #define name_von_der_h_file
    
    /*
    --hier die Funktionen und was es nicht alles gibt--
    */
    
    #endif
    


  • Das

    #ifndef name_von_der_h_file 
    #define name_von_der_h_file
    

    habe ich garnicht in meiner .h Datei stehen.

    Habe einfach den Text von der .cpp Datei in die .h kopiert läuft auch!

    #include <iostream.h> 
    
    void schreibe(char* text) 
    { 
       cout << text << endl; 
    }
    


  • Du wirst nur Schwierigkeiten haben, wenn du die .h Datei öfters einbindest. Such mal nach "Include Guard".



  • Da du zwar von allen Seiten Informationen bekommst, was man machen muss, aber anscheinend noch nicht weit genug bist, um das richtig in den Zusammenhang zu bringen, mal ein komplettes Beispiel:

    // schreibe.h -- Headerdatei, enthält nur Deklarationen
    // schutz vor Mehrfacheinbindung:
    #ifndef SCHREIBE_H_INCLUDED
    #define SCHREIBE_H_INCLUDED
    
    // Deklaration der Funktion:
    void schreibe(const char *);
      // warum const? Die Funktion verändert nicht den Inhalt des übergebenen Zeigers, 
      // sondern liest ihn nur, also dokumentieren wir das mit const. Und der Compiler
      // sagt, wenn wir irgendwo doch die Spielregeln brechen
    #endif
    
    // -------------------------------------------
    
    // schreibe.cpp -- Implementationsdatei
    #include "schreibe.h" // streng genommen unnötig, aber durch Einbindung von schreibe.h macht uns der Compiler auf nicht übereinstimmende Deklarationen aufmerksam
    #include <iostream>
    using namespace std;
    
    void schreibe(const char * text) {
      cout << text << endl;
    }
    
    // -------------------------------------------
    
    // main.cpp -- Hauptprogramm
    #include "schreibe.h" // damit die Funktion schreibe bekannt ist
    
    int main() {
      schreibe("Hallo Welt");
    }
    


  • Hey ich danke dir für deine tolle Unterstützung...
    Danke für das Beispiel ist echt gut und super zu verstehen!


Anmelden zum Antworten