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
#include "klasse.hh" int klasse::dlen() { return 64; }
#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 eswarum 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