Ursachen für ILINK32 Fehler: Ungelöste externe '__fastcall System :: TObject :: NewInstance (System :: TMetaClass *)' von XXX.obj verwiesen?

StackOverflow https://stackoverflow.com/questions/1420515

  •  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:

  1. Dieser Fehler kann nicht bei jeder Installation Maschine oder C ++ Builder reproduziert werden (ich habe mindestens 5 von ihnen geprüft).
  2. Wenn Sie OBJ-Datei entfernen und stattdessen entsprechende pas-Datei in das Projekt -. Die Fehler verschwinden
  3. Wenn Sie aber pas-Datei entfernen und schließen obj-Datei wieder - es wird kein Fehler sein.
  4. 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
  5. 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.

War es hilfreich?

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?

scroll top