g++ /ld abstract class linkage



  • Hallo,

    ich habe folgendes Problem:
    eine abstrakte Klasse, das Interface wird in einer anderen Klasse implementiert. Soweit so gut.
    Solange alles in ein paar Files ist funktioniert das ganze auch.
    Wenn ich nun aber die Definitionen fuer die abgeleitete Klasse rausnehme und separat compiliere, laesst sich das ganze nicht mehr zusammenlinken.
    Ich wollte wissen ob das ein etwas eigenartiges Verhalten von gcc ist oder ob das irgendeinem Standard zuwieder ist und wie ich das umgehen/fixen kann.

    iface.hh

    #ifndef iface_hh
    #define iface_hh
    
    struct iface
    {
      virtual int dlen()=0;
      virtual ~iface() = 0;
    };
    iface::~iface() {}
    
    #endif
    

    klasse.hh

    #ifndef klasse_hh
    #define klasse_hh
    
    #include "iface.hh"
    
    struct klasse : iface
    {
      int dlen();
    };
    
    #endif
    

    klasse.cc

    #include "klasse.hh"
    
    int klasse::dlen() { return 64; }
    

    test.cc

    #include <iostream>
    #include "iface.hh"
    #include "klasse.hh"
    
    using std::cout;
    using std::endl;
    
    int main()
    {
      klasse k;
      iface *i;
      i=&k;
      cout<<k.dlen()<<endl;
      cout<<i->dlen()<<endl;
      return 0;
    }
    
    $ g++ -Wall *.cc
    /tmp/ccweof1G.o(.text+0x0): In function `iface::~iface()':
    : multiple definition of `iface::~iface()'
    /tmp/cce4o1vw.o(.text+0x0): first defined here
    /tmp/ccweof1G.o(.text+0x2a): In function `iface::~iface()':
    : multiple definition of `iface::~iface()'
    /tmp/cce4o1vw.o(.text+0x2a): first defined here
    /tmp/ccweof1G.o(.text+0x54): In function `iface::~iface()':
    : multiple definition of `iface::~iface()'
    /tmp/cce4o1vw.o(.text+0x54): first defined here
    collect2: ld returned 1 exit status
    

    Darf ich den code von test.cc nicht herausnehmen, bzw muss ich den jedes mal wo ich test.hh verwende miteinbinden und neu compilieren??
    Gibt es dafuer irgendwelche compileflags um einmal Symbole fuer das Interface zu erstellen bzw NICHT zu erstellen?

    Danke schon mal fuer Antworten 😉



  • einstellungen kann ich dir nicht sagen, aber wenn das interface noch nicht
    fest steht mach noch dtor nur virtual, nicht pure. dann geht es

    warum muss eigentlich der dtor pure virtual sein?
    weis jemand die vorteile bzw. die nachteile?

    [edit]
    oder die definition des dtors(iface) in eine *.cpp schreiben.



  • Aye!

    Das mit dtor rausnehmen und extra compilieren wars, warum ich da nicht selber drauf gekommen bin... 🤡 🙄

    Herzlichen Dank fuer Hinweis, hast mir damit viel Gram erspart.
    Ciao


Anmelden zum Antworten