multiple definition of `test::testing::GetX()'



  • morgaehn leute

    folgendes problem:
    folgender code wird vom MinGW nicht genommen:

    namespacetest.h

    #ifndef namespacetestH
    #define namespacetestH
    
    namespace test
    {
       class testing
       {
          private:
             int x;
    
          public:
              int GetX(void);
       };
    }
    
    #endif
    

    namespacetest.cpp

    #ifndef NamespaceTestCpp
    #define NamespaceTestCpp
    
    #include "namespacetest.h"
    
    int test::testing::GetX(void)
    {
       return x;
    }
    
    #endif
    

    demo.cpp

    #include <stdio.h>
    #include "namespacetest.cpp"
    
    int main(void)
    {
       test::testing h;
    
       printf("%i", h.GetX());   
    }
    

    Fehlermeldungen:

    demo.cpp
    demo.cpp:9:2: warning: no newline at end of file
    Linking...
    K:\Txl\namespace\demo\Debug\namespacetest.o(.text+0x0): In function `ZN4test7testing4GetXEv':
    K:\Txl\namespace\demo\namespacetest.cpp:9: multiple definition of `test::testing::GetX()'
    K:\Txl\namespace\demo\Debug\demo.o(.text+0x0):K:\Txl\namespace\demo\namespacetest.cpp:9: first defined here
    
    demo.exe - 2 error(s), 1 warning(s)
    

    kann mir jemand sagen, was da los ist ?
    und kann man dem developer studio irgendwie beibringen, das man die fehlermeldungen auch mit Ctrl-C kopieren kann und nicht mit der doofen maus ?

    Meep Meep



  • man includiert keine cpp in der main-cpp

    #include "namespacetest.cpp"

    nur den header.

    die implementierungs - cpp braucht auch keine includewächter.

    so long



  • Naja, Du includest ein cpp-File. Das bringt eine Definition der Funktion mit. Außerdem hast Du das cpp-File vermutlich in Dein Projekt mit eingebunden. Es wird also mitübersetzt und erzeugt ebenfalls eine Definition der Funktion. Dadurch hat der Linker zwei und kann sich nicht entscheiden.

    Einfach Lösung: niemals eine cpp-Datei includen.



  • jetz hab ich anstatt der namespacetest.cpp die namespacetest.h eingebunden. jetz kommt:

    demo.cpp
    demo.cpp:9:2: warning: no newline at end of file
    Linking...
    K:\Txl\namespace\demo\Debug\demo.o(.text+0x29): In function `main':
    K:\Txl\namespace\demo\demo.cpp:8: undefined reference to `test::testing::GetX()'
    
    demo.exe - 1 error(s), 1 warning(s)
    

    ansonsten hab ich immer den BCB verwendet. und da hab ich immer die cpp eingebunden. da hats noch nie ne meldung gegeben.
    demo.cpp:9:2: warning: no newline at end of file <- find ich auch lustig. ich kann ja kein unendlich grosses file machen, nur damit er nach dem dateiende noch ne zeile findet. oder hat in der programmierung dateiende eine andere bedeutung ? *g

    Meep Meep



  • Die Warnung heißt einfach, daß Du kein newLine am Ende Deiner Datei hast. Einfach reingehen, ganz ans Ende und einmal fest auf die Return-Taste hauen!

    Du mußte natürlich die andere cpp-Datei mitübersetzen. Und die beiden Kompilate dann zusammenlinken.

    MfG Jester



  • hab bis jetz noch nie haendisch etwas kompiliert.
    koenntest du mir bitte mal anhand der drei dateien zeigen wie ich das selbst mache ?

    gcc demo.cpp namespacetest.cpp namespacetest.h

    wird wohl nicht funktionieren

    Meep Meep



  • Probier's mal mit

    g++ demo.cpp namespacetest.cpp

    das sollte afaik funktionieren.

    Du solltest Dich mal ne Runde mit dem Übersetzungsmodell von C++ beschäftigen. Dann passieren so Sachen wie cpp einbinden oder header kompilieren nicht.
    Kostet nicht viel zeit, aber gehört einfach dazu wenn man mit C++ arbeiten will/muß.



  • nimm auch nochmal die includewächter um die implementierungsdatei raus.



  • warum sollte ihn der includewaechter in der cpp stoeren ?
    naja egal

    jetz hab ichs mal einfach mal nur mit includieren der header gemacht und das dann mit hand compilieren pobiert.

    folgender source:

    message.cpp

    inline Message::Message(void)
    {
    
    }
    inline Message::~Message(void)
    {
    
    }
    
    inline void Message::Show(const char *t_caption,const char *t_text,HANDLE t_handle)
    {
       MessageBox(0,t_text,t_caption,MB_OK);
    }
    

    message.h

    #ifndef MessageH
    #define MessageH
    
    #include <windows.h>
    
    class Message
    {
       private:
          // Methoden
    
          // Variablen
          void *handle;
    
       public:
          // Konstruktor und Destruktor
          inline Message(void);
          inline ~Message(void);
    
          // Operatoren
    
          // Methoden
          inline void Show(const char *t_caption,const char *t_text,HANDLE t_handle = 0);
    
          // Variablen
    
    };
    
    #endif
    

    main.cpp

    
    

    compiliert mit:

    gcc demo.cpp message.cpp
    

    dann bekomm ich folgende fehlermeldung:

    message.h:16: warning: inline function `Message::Message()' used but never
       defined
    message.h:17: warning: inline function `Message::~Message()' used but never
       defined
    message.h:22: warning: inline function `void Message::Show(const char*, const
       char*, void*)' used but never defined
    message.cpp:1: error: syntax error before `::' token
    message.cpp:5: error: syntax error before `::' token
    message.cpp:10: error: syntax error before `::' token
    

    mit dem bcb hat das eigendlich immer geklappt. wo liegt da der fehler ?
    oder waere es gescheiter wenn ich mich nochmal fuer 2-3 jahre ins bett lege. vielleicht bin ich dann ausgeschlafen genug *gruebel

    Meep Meep



  • methoden, die inline sind, müssen in dem header mit definiert werden.

    inlines sind meist überflüssig. compiler sind klug.



  • @elise:
    danke fuer die antwort.
    der compiler von borland scheint dann so ziemlich das ueberlste zu sein, was so am markt ist. der hat sich darueber noch nie aufgeregt. bin grad draufgekommenm das ich mit dem gcc fast nix kompilieren kann, was mit dem bcb anstandslos funktioniert hat

    Meep Meep


Anmelden zum Antworten