Multiple Definition, die gar keine ist



  • Ich binde die .cpp-Quelltexte ein, da passt das doch nicht, oder? Und wenn, wie?

    omg... Wo lernt man denn so etwas?

    du includierst nur die *.h - die *.cpp beinhalten die implementationen und binden zuvor den jeweiligen header ein
    der compiler compiliert die *.cpp dateien von allein und linkt das dann halt...
    wenn du die *.cpp selbst includest, ist es klar, dass er sich beschwert, weil er die schon kennt...

    bb



  • Little Programmer schrieb:

    Ich hab das grad mal durchgelesen, das ist aber scheinbar nur für Klassendefinitionen oder header-Dateien. Ich binde die .cpp-Quelltexte ein, da passt das doch nicht, oder? Und wenn, wie?

    #include <C:/XXX/Konfiguration_laden.cpp>
    #include <C:/XXX/Spielfeld_skalieren.cpp>
    #include <SDL/SDL.h>
    using namespace std;
    

    Das ist leider grober Unfug, was du da machst 😉 Ich empfehle, den Abschnitt bezüglich compilierung mit mehreren Source-Dateien im Buch/Tutorial deiner Wahl nochmal genauer zu studieren.



  • Aber wie mache ich das sonst? Soll ich einfach die XXX.cpp in eine XXX.h umbenennen, die die Funktion enthält?

    Edit: Grad beim schreiben kam unten noch der post von unskilled.

    Bedeutet das, dass ich einfach nur die SDL und fstream Header einbinde und wenn ich Funktionen aus anderen XXX.cpp Dateien im Projekt verwende, erkennt der Compiler dies automatisch? 😕



  • du fügst in deiner ide die *.cpp dateien dem projekt hinzu...
    damit werden die schon mal _immer_ compiliert

    und wenn du deren funktionalität brauchst, included du den jeweiligen header - und nach dem fertig compilieren, linkt der linker die aufrufe eben richtig...

    bb



  • Ich schein ja einiges falsch zu machen 🙄 .

    wenn du deren funktionalität brauchst, included du den jeweiligen header

    Das versteht ich jetzt nicht. Wnn ich z.B. folgende (Pseudocode-)Dateien habe:

    main.cpp

    #include <SDL/SDL.h>
    int main()
    {
    funktion();
    }
    

    funktion.cpp

    #include <SDL/SDL.h>
    void funktion(void)
    {
    zweiteFunktion();
    //tut etwas
    }
    

    zweiteFunktion.cpp

    #include <SDL/SDL.h>
    void zweiteFunktion(void)
    {
    //tut etwas
    }
    

    Wenn diese Dateien zu einem Projekt gehören, kann ich das Projekt dann einfach direkt kompilieren oder was für "jeweilige" Header sind das, die ich dann einbinden müsste, damit die Verlinkung klappt?


  • Administrator

    Nein, die Header fehlen 🙂

    function.hpp

    #ifndef FUNCTION_HEADER_GUARD__
    #define FUNCTION_HEADER_GUARD__
    
    // Deklaration
    
    void function();
    
    #endif // FUNCTION_HEADER_GUARD__
    

    function.cpp

    #include "function.hpp"
    
    // Definition
    
    void function()
    {
      // ...
    }
    

    main.cpp

    #include "function.hpp"
    
    int main()
    {
      function();
      return 0;
    }
    

    Jetzt musst du function.cpp kompilieren und beim Kompilieren von main.cpp das Objectfile, welches beim kompilieren von function.cpp enstanden ist, dazulinken. In einer vernünftigen IDE passiert dies automatisch 😉

    Grüssli



  • Hi,

    sieht aus, als hättest Du bislang einfach gar keine Header.
    Die solltest Du schleunigst bauen und einsetzen:

    Neu:

    funktion.h

    #ifndef FUNKTION_H
    #define FUNKTION_H
    
    void funktion(void);
    
    #endif // FUNKTION_H
    

    zweiteFunktion.h

    #ifndef ZWEITEFUNKTION_H
    #define ZWEITEFUNKTION_H
    
    void zweiteFunktion(void);
    
    #endif // ZWEITEFUNKTION_H
    

    Da wo Du die Funktionen definierst
    : die "eigenen Header" (wegen der "Schnittstellenkonsistenz") und
    : die Header der Funktionalitäten, die Du für die Implementierung brauchst:

    funktion.cpp

    #include "funktion.h"
    
    #include <SDL/SDL.h> // falls Du wirklich SDL noch bei "tut was" brauchst
    #include "zweiteFunktion.h"
    
    void funktion(void)
    {
    zweiteFunktion();
    //tut etwas
    }
    

    zweiteFunktion.cpp

    #include "zweiteFunktion.h"
    
    #include <SDL/SDL.h>
    
    void zweiteFunktion(void)
    {
    //tut etwas
    }
    

    und schließlich da, wo Du die FUnktionen verwenden willst:

    main.cpp

    #include "funktion.h"
    
    int main() {
       funktion();
       return 0;
    }
    

    Gruß,

    Simon2.

    P.S.: Da war ich halt später als Dravere ....



  • Danke für eure Hilfe. Langsam versteh ich es. ich muss also in den Header-Datein immer nur den Funktionsnamen und die zu übergebenden Variablen deklarieren und den Teil mit den geschweiften Klammern benutzte ich nur in der *.cpp, oder?

    Edit: Rest der Frage hat sich erledigt, hatte was falsch gelesen 😮 .



  • Hiermit: http://de.wikibooks.org/wiki/C%2B%2B-Programmierung/_Weitere_Grundelemente/_Headerdateien

    Hab ich es jetzt endlich verstanden. Ich danke euch nochmal vielmals! Ohne euch hätte ich immer so weiter gemacht, wie bisher :(.



  • Little Programmer schrieb:

    ...Hab ich es jetzt endlich verstanden. Ich danke euch nochmal vielmals! ...

    👍 😋 👍
    Sehr gern geschehen!! Für sowas liebe ich das Forum (sowohl als Fragesteller als auch als Antwortengeber).
    Ich habe hier auch schon sehr viel gelernt - so viel, dass meine Kollegen schon sagen: "Du immer mit Deinem C++! Damit kann man anscheinend alles!" 😉

    ... und sehr schön, dass Du uns noch das Feedback gegeben hast.

    Gruß,

    Simon2.



  • Simon2 schrieb:

    Sehr gern geschehen!! Für sowas liebe ich das Forum (sowohl als Fragesteller als auch als Antwortengeber).
    Ich habe hier auch schon sehr viel gelernt - so viel, dass meine Kollegen schon sagen: "Du immer mit Deinem C++! Damit kann man anscheinend alles!" 😉

    ... und sehr schön, dass Du uns noch das Feedback gegeben hast.

    Jup, so macht das Forum Spaß und Sinn 🙂 Mir gehts ähnlich mit dem Lernen - und mit den Kollegen. Inzwischen kommen sie mit C++-Fragen zu mir. Und mit etwas Glück werd ich nächste Woche zur Partnerfirma versetzt wo sie C++-Entwickler brauchen, weg von Java *juhu*. Und nein, ich hab nichts gegen Java. Mir macht nur C++ mehr Spaß. Das ist persönliche Geschmackssache und sollte jetzt niemanden dazu anmieren hier den (n+1)ten Java-vs-C++-Flamewar vom Zaun zu brechen...


Anmelden zum Antworten