Problem mit mehrfach Definition



  • Hallo Community,

    Ich bekomme folgenden Fehler :

    obj\Debug\main.o||In function ZStplIcSt11char\_traitsIcESaIcEESbIT\_T0\_T1\_ERKS6\_PKS3\_':| line 11|multiple definition ofHTMLContainerDB'|
    obj\Debug\htmlcontainers_source.o:line 5|first defined here|

    meine htmlcontainers.h

    namespace HTMLContainer {
    std::vector<std::string> HTMLContainerDB;
    
    void LoadDB();
    }
    

    die dazugehörige cpp datei

    void HTMLContainer::LoadDB()
    {
         FileManager fmgr;
         fmgr.readFile("DB\\HTMLContainer.db",HTMLContainer::HTMLContainerDB);
    
    }
    

    und in meiner main.cpp

    HTMLContainer::LoadDB();
    

    Kann jemand einen Fehler erkennen ? Denn in der Zeile 5 der Datei htmlcontainers_source ist eine freie Zeile.Außerdem mach ich ja keine Definition sondern eher einen Aufruf.

    Wäre sehr nett und hilfreich wenn sich einer dies ansieht.

    MkG win32


  • Mod

    edit: Ach, das ist ja ein namespace*! Tut mir leid, verlesen.

    Dann ist die Antwort ganz leicht: Es wird ja eine Definition (von HTMLContainerDB) im Header vorgenommen. Die steht dann überall wo der Header eingebnunden wird -> mehrfache Definition. Daher: Keine Definitionen in Header (außer Templates und/oder inline)!

    *: Der Grund, warum ich da zuerst eine class gelesen habe, ist, dass du es aufschreibst und benutzt wie eine Klasse. Ich habe den Eindruck, es soll eine Klasse sein. Sicher, dass es keine Klasse sein soll?



  • in der Cpp Datei müsste doch eher sowas stehen:

    namespace HTMLContainer {
    void LoadDB()
    {
         FileManager fmgr;
         fmgr.readFile("DB\\HTMLContainer.db",HTMLContainer::HTMLContainerDB);
    
    }
    };
    


  • SeppJ , danke für die schnelle Antwort, und ja ich dachte mir auch gerade das ich mir das ganze in eine Klasse verpacken wollte, welche ich aber vergessen habe, da ich den Namespace sowieso machen wollte...

    Skym0sh0, aus welchem Grund sollte das so sein ? Ich benutze die Funktion einfach direkt aus dem namespace.

    Dann werde ich das einfach so machen

    namespace HTMLContainer {
    class HTMLContainer_Database {
    public :
    std::vector<std::string> HTMLContainerDB;
    void LoadDB();
    };
    
    }
    

    und

    HTMLContainer::HTMLContainer_Database::LoadDB(){}
    

    Ich entschuldige mich für so eine kleine Lappalie einen Post zu machen und eure Zeit in "die Tonne zu treten", aber mich würde es interessieren, SeppJ , warum die Definition mehrfach sein soll, wenn die eigentliche,einmalige Definition im Header steht und dann in den Dateien, wo sie eingebunden ist, nur "benutzt" wird.

    MkG win32



  • Wenn du in zwei Übersetzungseinheiten denselben Header einbindest, dann steht der selbe Code in beiden Übersetzungseinheiten.
    Sprich, in beiden wird die gleiche Funktion definiert.
    Nun sieht der Linker, dass in den entsprechenden beiden Objekt-dateien, die der Compiler generiert, ein Symbol mehrfach definiert wurde ➡ Mehrfachdefinition



  • Sone, vielen Dank für deine Antwort.Hört sich für mich nun auch logisch an, ich werde mir dennoch das Kapitel über einbinden von Header Dateien nochmal sorgfältig durchlesen.

    Mkg win32


Log in to reply