namspace includen



  • Hey,

    ich habe einen namespace, dieser enthält (zur zeit) eine Variable ( nen mutex). Diese soll nun global im Programm sein.
    Nun kommt bei mir aber der Fehler:

    Connection_Handler.obj : error LNK2005: "class boost::mutex mutex::io" (?io@mutex@@3V1boost@@A) ist bereits in Connection.obj definiert.
    main.obj : error LNK2005: "class boost::mutex mutex::io" (?io@mutex@@3V1boost@@A) ist bereits in Connection.obj definiert.
    E:\Programmieren\Chat_Project\Debug\Chat_Project.exe : fatal error LNK1169: Mindestens ein mehrfach definiertes Symbol gefunden.
    

    Also der Compiler denkt das das objekt/die Variable mehrfachdeklariert wird.
    Nur kapier ich nicht wieso. Ist das includen von einer .h nicht genauso also würde man die QC in die darauffolgende .h includen und dann immer so weiter bist zur main.cpp? Dann dürfte es doch eigtl rein logisch keine Probleme geben, oder sitze ich da einem fatalen Fehler auf?



  • Du inkludierst wahrscheinlich den Header mehrmals. Der Compiler bastelt aus jeder cpp-Datei eine Objektdatei. In dieser ist dann alles drin, was entsprechend in der cpp-Datei enthalten ist, auch der Header. Nun gibt es deine Variable in mehreren compilierten Einheiten. Der Linker meldet einen Fehler.



  • Also der Compiler bzw Linker meckert sicherlich nicht wegen einer Mehrfachdeklaration, wenn dann wegen einer Mehrfachdefinition( was bei dir auch der Fall ist ), denn Deklaration und Definition ist ein großer Unterschied.
    Deklarieren darfste eigentlich so oft du willst( Stichwort extern ), blos definieren nicht.

    Also setz mal ein extern davor, dann müsst es funktionieren.

    Hoffe ich konnte helfen.

    Lg freeG



  • namespace mutex    //globaler mutex für den IO bereich!
    { 
    	extern boost::mutex io;
    }
    

    jetzt sagt er mir das wär ein nicht aufgelöstes externes symbol -.-, was soll ich da auflösen?
    Ich habe ausserdem immernoch noch nicht ganz verstanden was der Compiler dagegen hat?

    Du inkludierst wahrscheinlich den Header mehrmals.

    Ja in die nächste, in der hirachie drunter liegende .h. Aber nur ein mal, deswegen verwirrt mich der Fehler ja uach so.



  • Das ist lediglich eine Deklaration. Du musst io noch definieren. Also in eine .cpp das hier packen:

    namespace mutex    //globaler mutex für den IO bereich!
    { 
        boost::mutex io;
    }
    

    Das extern sagt nichts anderes, dass du die Definition irgendwo genau 1 mal machst.



  • so es klappt

    in der .h

    namespace mutex    //globaler mutex für den IO bereich!
    { 
    	extern boost::mutex io;
    }
    

    in der .cpp

    namespace mutex    //globaler mutex für den IO bereich!
    { 
    	boost::mutex io;
    }
    


  • Komisch; denn das mit dem int ist definitiv falsch so.

    Kann es sein, dass Du vergessen hast, Dein Programm gegen die boost-Thread-Bibliothek zu linken?


Anmelden zum Antworten