Ursachen für ILINK32 Fehler: Ungelöste externe '__fastcall System :: TObject :: NewInstance (System :: TMetaClass *)' von XXX.obj verwiesen?
-
07-07-2019 - |
Frage
Ich erhalte den folgenden Fehler von C ++ Builder 2009 des Linkers
Unresolved external '__fastcall System::TObject::NewInstance(System::TMetaClass *)' referenced from XXX.obj?
Wir haben eine Reihe von Delphi-Dateien (.pas
) und eine Reihe von C ++ Builder-Dateien (.hpp
und .obj
), die sich aus diesen .pas
Dateien generiert wurde.
Set von Dateien auf einem anderen Rechner kopiert. Beide Maschine hat die gleiche C ++ Builder 2009-Version mit dem gleichen Updates. (Zuletzt: 3 + 4) installiert
Wenn ich eine leere VCL-Anwendung in C ++ Builder auf anderer Maschine erstellen und umfasse eine OBJ-Datei aus dieser Menge an aktivem Projekt, erhalte ich die oben genannten Fehler bei der Stufe verknüpft.
Die seltsamen Dinge über diesen Fehler:
- Dieser Fehler kann nicht bei jeder Installation Maschine oder C ++ Builder reproduziert werden (ich habe mindestens 5 von ihnen geprüft).
- Wenn Sie OBJ-Datei entfernen und stattdessen entsprechende pas-Datei in das Projekt -. Die Fehler verschwinden
- Wenn Sie aber pas-Datei entfernen und schließen obj-Datei wieder - es wird kein Fehler sein.
- Keine der obj von pas-Dateien wird in dem Prozess verändert. D. h wenn Sie diesen Satz von Dateien aus dem Gerät löschen und von der ersten Maschine bringen wieder (wo sie erstellt wurden.) - Sie werden immer noch keinen Fehler haben
- Wenn Sie auf einer bestimmten Maschine, die Reihenfolge zu tun (/ Ausschluss pas-Datei aus dem Projekt) - Sie können nicht mehr diese Fehler auf dieser Maschine bekommen, egal wie hart Sie versuchen (Verschieben von Dateien zwischen Ordnern, mit den Einstellungen spielen , etc, etc). Eigentlich habe ich schon keine Maschinen, wo ich diesen Fehler reproduzieren können jetzt: (
Ich sehe nicht, wie Situation „nach“ von Situation ist anders „vor“ (nach / vor der Aufnahme von pas-Datei), so Fehler sind nur sichtbar, vor und nicht nach.
Die einzige Erwähnung dieses Fehlers (oder ein sehr ähnlichen Fehler) im Internet ist diese . Aber es gibt keine Lösung. Es gibt keine „+“ Zeichen auf dem Weg noch Leerzeichen (“„).
Bin ich etwas fehlt? Im Moment sieht es aus wie C ++ Builder Fehler zu mir.
P. S. Wir können nicht „nur enthalten pas-Datei“ Lösung, da wir nur .hpp
und .obj
(keine .pas
-Dateien) auf bestimmte Maschinen müssen bereitstellen.
Lösung 3
Okay, ich habe Antwort gefunden: war der Grund, warum einige falsche IDE oder Projekteinstellungen (ich weiß nicht sicher)
.Ich habe mehrere Versionen von C ++ Builder und Delphis installiert. Und aus irgendeinem Grund C ++ Builder 2009 Linker aufgenommen falsch OBJ-Dateien - diejenigen, die für eine andere Version (möglich 2007) verwendet werden soll.
Der Grund für den Fehler ist, dass NewInstance wurde zwischen 2007 und 2009 Versionen geändert - siehe hier:
Andere Tipps
Ich habe auch diesen Fehler, aber es war, weil ich hatte dies definiert:
virtual void getMaxSafeSpace();
Statt:
virtual void getMaxSafeSpace()=0;
in meiner abstrakten Klasse.
Sieht aus wie wenn Sie das Projekt aus den pas-Dateien erstellen, dann eine Kopie der Funktion ‚__fastcall System :: TObject :: NewInstance (System :: TMetaClass *)‘ irgendwo definiert wird, aber nicht in den OBJ Dateien, und die binären verknüpft. Sobald die Funktion definiert ist, dann findet die XXX.obj Datei es. Also, wenn Sie aktuelle OBJ-Dateien löschen und OBJ-Dateien von einer anderen Maschine bringen, wird der Fehler nicht mehr gesehen. Dies ist nur meine Gedanken. Ich weder weiß noch Delphi haben keine Ahnung von pas-Dateien oder C ++ Builder.
Ist Ihr Projekt ist die Schaffung dll oder irgendeine Art von externen Bibliotheken, in denen System :: TObject :: NewInstance () Funktion definiert ist und auf den binären verknüpft?