multiple definition of function() first defined here



  • Hallo...

    Ich habe drei Dateien main.cpp, Header.cpp, Header.hpp

    main.cpp:

    #include Header.cpp

    int main(){...}

    in der Header.cpp:

    #include Header.hpp

    dann definitionen aus den Methoden der Klasse in der Header.hpp

    z.B.
    int Klasse::get(){...}

    usw.

    in der Header.hpp:
    #ifndef HEADER_hpp
    #define HEADER_hpp

    #include <iostream>
    #include <cstdlib>
    #include <windows.h>

    class Klasse {...};

    ostream& operator<< (ostream& op, Klasse& x){
    opx.get<<"\n";
    return op;
    }

    Nach dem Compilieren gibt es folgende Fehlermeldungen:

    multiple definition of 'Klasse::get()'
    first defined here
    ...
    ...
    ld returned 1 exit status

    was mache ich falsch???

    Danke schon im Voraus!



  • Wenn du in main.cpp die Header-Datei includierst und nicht das Cpp sollte es funktionieren. 😉



  • Du hast die Klasse ansonsten 2mal übersetzt... einmal beim Übersetzen von main.cpp und zum anderen beim Übersetzen von header.cpp (da er den Inhalt von header.cpp in main.cpp kopiert...).



  • Jetzt sind es zwar ein paar weniger von den Meldungen, und zwar die aus der header.cpp sind weg...aber aus der Header.hpp, also ostream& operator... sind noch immer da.

    Die Header.cpp muss doch irgendwo aufgerufen werden?!



  • entweder schreibst du ein inline vor den operator oder du deklarierst ihn nur und definierst ihn in der .cpp-Datei.

    inline ostream& operator<< (ostream& op, Klasse cosnt & x){ 
       opx.get() << '\n';  // vermutlich besser ohne '\n'
       return op; 
    }
    

    und nicht vergessen get() zu einer konstanten Methode zu machen!



  • Ok, die Idee war gut...

    jetzt ist aber immer noch ein Fehler:

    in der header.hpp steht:

    typedef short _stdcall (*inpfuncPtr)(short portAddr );
    typedef void _stdcall (*oupfuncPtr)(short portAddr,short valOut);
    
       inpfuncPtr inp32;
       oupfuncPtr out32;
    

    und der fehler wie immer... multiple definition of 'inp32' etc.

    was kann ich da machen?



  • // .hpp
    typedef short _stdcall (*inpfuncPtr)(short portAddr );
    typedef void _stdcall (*oupfuncPtr)(short portAddr,short valOut);
    
    extern inpfuncPtr inp32;
    extern oupfuncPtr out32;
    
    // .cpp
    inpfuncPtr inp32;
    oupfuncPtr out32;
    


  • pfidu schrieb:

    inpfuncPtr inp32;
       oupfuncPtr out32;
    

    Sind das statische Variablen? (Wenn ja, dann werden diese beim mehrfachen Includieren des Headers ebenfalls mehrfach angelegt.)

    Deklariere die Variablen besser als Klassenvariablen und initialisiere sie dann im Cpp. Wenn du es sauber machen möchtest würde ich dann noch Zugriffsfunktionen schreiben. 😉



  • Da war ich wohl zu spät... 😞



  • Vielen Dank, es funktioniert!!!

    keine Fehler mehr...

    Schöner Tag!



  • in DEV-C++ klappt alles...aber in Visual C++ hat er Probleme mit

    typedef short _stdcall (*inpfuncPtr)(short portAddr );
    typedef void _stdcall (*oupfuncPtr)(short portAddr,short valOut);
    
    extern inpfuncPtr inp32;
    extern oupfuncPtr out32;
    

    ?????????????


Anmelden zum Antworten