undefined reference to vtable - virtuelle member-Klassen generiert, die von gsoap
gsoap mit seinen tools wsdl2h und soapcpp2 mich mit einer soapStub.h-Datei, die Folgendes enthält:
class SOAP_CMAC ns2__SOAPKunden
{
public:
std::string *adresszusatz;
//...
public:
virtual int soap_type() const { return 7; }
//...
ns2__SOAPKunden() : adresszusatz(NULL), x(NULL) { } //left out all member init.
virtual ~ns2__SOAPKunden() { }
};
Beginne ich mit einer kleinen app mit der Klasse zum füllen von Objekten mit Daten aus der informix-DB.
Aber erfolgreich kompiliert habe ich, lassen sich alle virtuellen Sachen - fand ich viele Beiträge zu diesem Fehler und die Nutzung virtueller member in Unterklassen - sonst bekomme ich
main.o: In function `ns2__SOAPKunden::ns2__SOAPKunden()':
main.cpp:(.text._ZN15ns2__SOAPKundenC1Ev[ns2__SOAPKunden::ns2__SOAPKunden()]+0xf): undefined reference to `vtable for ns2__SOAPKunden'
main.o: In function `ns2__SOAPKunden::~ns2__SOAPKunden()':
main.cpp:(.text._ZN15ns2__SOAPKundenD1Ev[ns2__SOAPKunden::~ns2__SOAPKunden()]+0x13): undefined reference to `vtable for ns2__SOAPKunden'
collect2: ld returned 1 exit status
Ich gebe zu, nach Jahren des Skripts nur es ist sehr schwer für mich, den Sinn von C++ - code... möchte ich Euch bitten, für jede Beratung, was zu versuchen nächsten. Meine Klasse ist keine abgeleitete Klasse ist zum Beispiel, was mich Wundern lässt.
Wenn Sie sich nicht mit abgeleiteten Klassen, warum ist die Funktion virtuelle?
InformationsquelleAutor groovehunter | 2011-01-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der Fehler bedeutet, dass die virtuelle Tabelle wurde nicht korrekt kompiliert/gelinkt in der letzten binary (ausführbare Datei oder Bibliothek). Es gibt zwei häufige Umstände führen zu diesem Fehler:
soapStub.cpp
insoapStub.o
, aber nicht hinzufügen, dass binäre auf der linker-Kommandozeile.Zweiten Fall ist am schwierigsten zu identifizieren, die für nicht-erfahrene Entwickler, und kann verursacht werden durch eine Klasse, die im header definiert und enthält virtuelle Funktionen. Wenn alle virtuellen Funktionen sind inline definiert, erzeugt der compiler der virtuellen Tabelle in der alle übersetzungseinheiten, die den Kopf, und markieren Sie es als ein schwaches symbol so, dass der linker kann Sie vernichten, aber wenn Sie später hinzufügen einer neuen virtuellen Methode und lassen Sie es undefiniert in die Kopf-oder wenn Sie entfernen die definition von einem virtuellen Funktionen--, dann wird der compiler nicht generiert der virtuelle Tabelle in jeder übersetzungseinheit, aber nur in die eine, definiert die Funktionen.
Dinge zu überprüfen:
Ja, der zweite Fall. Einige Compiler (gcc unter Ihnen) erzeugen die vtable in eine einzige übersetzungseinheit. GCC definiert die vtable nur in der übersetzungseinheit enthält die erste (in der Reihenfolge der Deklaration) non-inline-virtuelle Funktion, die in vielen Fällen wird der Destruktor (oft Klassendefinitionen beginnen mit Konstruktoren/Destruktoren)
Clang hat ein
-Wweak-vtable
Warnung für dieses (ich habe herausgefunden, durch Zufall, wenn Sie versuchen-Weverything
auf eine header-only-Bibliothek)InformationsquelleAutor David Rodríguez - dribeas
Dies ist, was David Rodriguez, sagte, gerade dargelegt einfacher denke ich...
Hatte ich diese situation in mein interface Klasse:
und es geändert:
was hat den trick.
begin() und end() definiert wurden, in der abgeleiteten Klasse in einer anderen Datei, IBase-Klasse (interface) wurde nur deklariert in der header und in einigen Orten.
Fehler aus der OP nur erschien, wenn ich Optimierungen zu keiner (-O0), jede andere Einstellung ergab keine Fehler (gcc 4.8).
InformationsquelleAutor nidalpres