ständige multiple defition



  • Hallo zusammen,

    Es wird mir ständig von meiner IDE zurück gegeben, dass ein Objekt bereits defintiert sein soll.
    Ich benutze QT als IDE (trotzdem schreibs ich mal hier rein, da es sich eigentlich um reine c++ syntax handelt und nicht wirklich mit dem QT Framework zu tun hat).

    Ich habe 4 fileS (Sharing.h, thread.h, thread.cpp, main.cpp)

    Sharing.h

    #ifndef SHARING_H
    #define SHARING_H
    
    #include <QMutex>
    
    QMutex mutex;
    
    #endif // SHARING_H
    

    thread.h

    #ifndef THREAD_H
    #define THREAD_H
    
    #include <QThread>
    #include "Sharing.h"
    #include <iostream>
    
    using namespace std;
    
    class Thread : public QThread
    {
    public:
        Thread();
    
    protected:
        void run();
    
    private:
    };
    
    #endif // THREAD_H
    

    main.cpp

    #include <QtCore/QCoreApplication>
    
    #include "thread.h"
    
    int main(int argc, char *argv[])
    {
        QCoreApplication a(argc, argv);
    
        Thread td1;
        Thread td2;
    
        return a.exec();
    }
    

    Thread.cpp

    #include "thread.h"
    
    Thread::Thread()
    {
        Thread::run();
    }
    
    void Thread::run(){
        for(int Idx=0;Idx<20;Idx++){
            mutex.lock();
            cout << Idx << endl;
            mutex.unlock();
        }
    }
    

    Die Fehlermeldung wird dadurch kommen, dass 2x Thread.h included wird.
    Jedoch begreiffe ich nicht warum das ISNDEF nicht greifft.

    Wer kann mir helfen?



  • Wäre nicht schlecht wenn du jetzt vielleicht auch noch die Fehlermeldung postet 😉

    Lg freeG



  • stimmt.. 😃

    "multiple definition of 'mutex'" thread.cpp 3

    Also beim Konstruktor von Thread (Thread::Thread()).
    Ergibt ja 0 Sinn. 😃

    mutex ist bei Sharing.h als QMutex deklariert.

    grz


  • Mod

    Du bist witzig. Ob dein mutex wohl einmal in jeder Übersetzungseinheit vorkommt, in der shared.h eingebunden wird? Wie soll das ifndef denn da greifen?



  • @definition
    Headerguards wirkien sich lediglich auf die gleiche Übersetzungseinheit (.cpp) aus. Und in dem ersten Header hast du eine Definition, welche so von mehreren .cpp's implementiert wird und daher hast du eine Mehrfachdefinition.

    Und anstatt jetzt in die ewige Singleton/extern Diskussion zu kommen erstell den Mutex lieber in der main und übergib ihn dann dem Thread. Das ist dann auch gerade viel flexibler.



  • SeppJ schrieb:

    Du bist witzig. Ob dein mutex wohl einmal in jeder Übersetzungseinheit vorkommt, in der shared.h eingebunden wird? Wie soll das ifndef denn da greifen?

    Stimmt, jetzt seh ichs auch 😃
    Ganz übersehen vor lauter Suche nach der Fehlermeldung, die ja jetzt doch nicht mal nötig gewesen wäre 🙄

    Lg freeG



  • definition schrieb:

    Es wird mir ständig von meiner IDE zurück gegeben, dass ein Objekt bereits defintiert sein soll.

    Sharing.h

    #ifndef SHARING_H
    #define SHARING_H
    
    #include <QMutex>
    
    extern QMutex mutex;
    
    #endif // SHARING_H
    

    Sharing.cpp

    //...
    QMutex mutex;
    //...
    

    Unabhängig davon das ich absolut kein Fan von globalen Variablen bin.



  • Könnt ihr mir kurz den Fix erklären? 🙂
    Es funktioniert nun, danke 😉
    Jetzt muss ich nur noch das mit dem Mutex hinkriegen, aber das ist ja ein anderes Thema.



  • definition schrieb:

    Könnt ihr mir kurz den Fix erklären? 🙂

    Das ist ein Anfängerfehler. Das wurde hier bestimmt schon zig mal durchgekaut. Ein paar Stichwörter für Deine Recherche:

    linkage (Bindung)
    translation unit (Übersetzungseinheit)
    one definition rule
    separate compilation (getrennte Übersetzung)

    Versuche auch rauszubekommen, was genau "Deklaration" und "Definition" bedeutet. In der C++ Welt haben diese zwei Wörter eine feststehende Bedeutung, die man kennen sollte.



  • krümelkacker schrieb:

    Das ist ein Anfängerfehler.

    Ist vor allem ein Fehler, bei dem es C++ dem Programmierer schwerer, als nötig macht. Das ist halt das Problem mit den historisch gewachsenen Strukturen von C++.



  • ProgChild schrieb:

    Ist vor allem ein Fehler, bei dem es C++ dem Programmierer schwerer, als nötig macht. Das ist halt das Problem mit den historisch gewachsenen Strukturen von C++.

    Trotzdem sollte man sich vielleicht mit dem Konzept der Übersetzungseinheiten und der ODR befassen. Das ist zentral in C++, auch wenn es ursprünglich von C kommt.

    Darüber hinaus muss man bei globalen Variablen sowieso überlegen, ob es nicht eine bessere Möglichkeit gibt.



  • Nexus schrieb:

    Trotzdem sollte man sich vielleicht mit dem Konzept der Übersetzungseinheiten und der ODR befassen. Das ist zentral in C++, auch wenn es ursprünglich von C kommt.

    Warum trotzdem? Natürlich muss man das wissen, wenn man C++ beherrschen will. Nur braucht man sich nicht blöd vorkommen, wenn man dieses Verhalten nicht sofort versteht. IMHO



  • ProgChild schrieb:

    Warum trotzdem?

    Naja, weil ich es für eine schlechte Entschuldigung halte, zu sagen: "Das ist ein historisches C++-Problem", nur weil man sich nicht damit befasst hat. Aber es ist natürlich wie du sagst ein Grund, warum man unter Umständen etwas länger braucht und sich ausführlicher mit dem Thema auseinandersetzen muss.


Anmelden zum Antworten