Undefined reference to 'operator delete(void*)'
Ich bin neu in der C++ - Programmierung, aber arbeite in C und Java für eine lange Zeit. Ich versuche eine Schnittstelle-wie Hierarchie, in einigen seriellen Protokoll, an dem ich arbeite, und bekomme immer die Fehlermeldung:
Undefined reference to 'operator delete(void*)'
Der (vereinfachte) code folgt unten:
PacketWriter.h:
class PacketWriter {
public:
virtual ~PacketWriter() {}
virtual uint8_t nextByte() = 0;
}
StringWriter.h:
class StringWriter : public PacketWriter {
public:
StringWriter(const char* message);
virtual uint8_t nextByte();
}
Den Konstruktor und nextByte Funktionen sind implementiert StringWriter.cpp, aber sonst nichts. Ich muss in der Lage sein, zu löschen StringWriter von einem Zeiger auf eine PacketWriter, und ich habe immer verschiedene andere ähnliche Fehler, wenn ich einen Destruktor definieren für die StringWriter -, virtueller oder nicht. Ich bin sicher, es ist ein einfaches Problem, das ich Blick als Neuling.
Auch, ich Schreibe dies für einen AVR chip mit dem avr-g++ auf Windows.
Dank
avr-gcc
oder etwas ähnliches, dann sollten Sie lieber avr-g++
oder gleichwertig.Sind Sie verknüpfen diese in einer eigenartigen Weise? Wenn Sie mit einem link gegen die übliche Laufzeit Implementierungen von
operator new
und operator delete
sind vorhanden, aber wenn Sie etwas tun, bareback möglicherweise müssen Sie definieren diese selbst.Dieser Fehler würde auftreten, wenn du nicht den link, den C++ - standard-Bibliotheken in die endgültige ausführbare Datei. Sind Sie verknüpft?
Ich bin mir ziemlich sicher, dass new/delete sind nicht umgesetzt, und das aus gutem Grund, es ist ein embedded system. Lesen Sie die Dokumentation ordnungsgemäß.
guter Fang: nongnu.org/avr-libc/user-manual/FAQ.html#faq_cplusplus . Sie können sich wahrscheinlich in diesem post als Antwort
InformationsquelleAutor Bracket | 2011-08-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie nicht verbindet, gegen die standard-Bibliothek aus irgendeinem Grund (wie durchaus der Fall sein kann in einem eingebetteten Szenario), Sie müssen Ihre eigenen Operatoren
new
unddelete
. Im einfachsten Fall könnten Sie wickeln einfachmalloc
oder Speicher in Ihre eigenen Lieblings-Quelle:Sollte nie müssen Sie dies tun, wenn Sie kompilieren für ein ordentliches, Hosting-Plattform, so dass, wenn Sie brauchen, um dies zu tun, werden Sie besser vertraut mit den Feinheiten der Speicherverwaltung auf Ihrer Plattform.
Ich weiß, es gibt Implementierungen von malloc und free für den AVR in C. Wenn ich nur wickeln Sie diese einmal irgendwo, Sie arbeiten für alle Objekte? Wo würde ich den code?
Sie legen den code einfach irgendwo in den globalen namespace und die link gegen Sie. Wenn Sie nicht möchten, dass
malloc
könnte man auch Speicher von einigen pool-Bereich und erhalten eine Kostenlose Liste oder sowas.Okay, das scheint zu funktionieren (oder zumindest kompilieren ohne Fehler :P). Danke!
Kühlen, aber Vorsicht, Sie haben wirklich zu wissen, was Sie tun und wo Sie immer Ihr Gedächtnis aus. Ich denke
malloc
ist ein sehr gefährliches Tier in der embedded-Welt, aber ich bin kein Experte durch eine lange erschossen.InformationsquelleAutor Kerrek SB
Sorry für das posten in einen alten thread, aber es ist immer noch ziemlich hoch in den Suchergebnissen von Google und wenn Sie dieses problem haben, sollten Sie wirklich überprüfen Sie Sie heraus dieser link, denn dort heißt es, dass Sie einfach brauchen, um link -lstdc++ und das ist, was das problem bei mir gelöst.
Die folgende Zeile wurde Hinzugefügt, die von der Gemeinschaft ohne dass wir Sie als solche und Sie stattdessen nur das hinzufügen von einem Kommentar zu meiner Antwort für die Gründe, die entziehen mir:
"Oder verwenden Sie einen C++ - compiler, wird implizit die Option-lstdc++ - option, z.B. g++."
Ich habe schlug meinen Kopf gegen eine Wand für mehrere Wochen versucht herauszufinden, warum meine CUDA-code nicht richtig laufen würde. Ich habe alles versucht, ich könnte möglicherweise zu finden. Ihr Kommentar behoben, alles, den Tag gerettet, löste mein Leben, und ich Liebe Sie so sehr. Danke danke danke danke!!!!!!!
stellen Sie sicher, dass -lstdc++ geht "nach" FWIW
Mein problem gelöst magisch an .Danke!!! Für den späteren Leser als Referenz: ich versuche, den link zu einer C++ - Bibliothek namens libzmq von meinem embedded Linux C code. Wenn ich einen C++ - compiler ist alles in Ordnung, aber wenn ich ein C-compiler aus irgendeinem Grund. Dann sehe ich all diese Undefinierte Fehler. Hinzufügen
-lstdc++
löst das problem.InformationsquelleAutor Alex
Will ich nur zitieren, der Dokumentation, da Sie es besser.
InformationsquelleAutor Vinicius Kamakura
Wenn Sie nur auf der Suche nach einer Schnittstelle, die Sie nicht brauchen new/delete. Nur entfernen Sie den "virtual" in der Basisklasse destructor, und stellen Sie sicher, dass die abgeleitete Klasse eine Implementierung von
__cxa_pure_virtual().
Hier ist eine kompilierbare Beispiel. (Ich entfernte die Renditen, die Dinge einfach zu halten, aber es funktioniert gut mit Ihnen.)
In PacketWriter.h
In StringWriter.h
In StringWriter.cpp
Kompilieren mit
avr-g++ StringWriter.cpp
InformationsquelleAutor MikeTwo