Cause dell'errore ILINK32: '__fastcall System :: TObject :: NewInstance (System :: TMetaClass *) esterno non risolto a cui fa riferimento XXX.obj?

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

  •  07-07-2019
  •  | 
  •  

Domanda

Ricevo il seguente errore dal linker di C ++ Builder 2009

Unresolved external '__fastcall System::TObject::NewInstance(System::TMetaClass *)' referenced from XXX.obj?

Abbiamo una serie di file Delphi ( .pas ) e una serie di file C ++ Builder ( .hpp e .obj ), che è stato generato da questi file .pas .

Il set di file viene copiato su un altro computer. Entrambe le macchine hanno la stessa versione C ++ Builder 2009 con gli stessi aggiornamenti (più recenti: 3 + 4) installati.

Quando creo un'applicazione VCL vuota in C ++ Builder su un'altra macchina e includo un file obj da questo set al progetto attivo, ottengo l'errore sopra menzionato nella fase di collegamento.

Le strane cose di questo errore sono:

  1. Questo errore può essere riprodotto non su tutte le macchine o l'installazione di C ++ Builder (ne ho verificate almeno 5).
  2. Se rimuovi obj-file e invece aggiungi il file pas corrispondente al progetto, l'errore scompare.
  3. Ma se rimuovi pas-file e includi di nuovo obj-file - non si verificherà alcun errore.
  4. Nessuno degli oggetti dei file pas viene modificato nel processo. Cioè se elimini questo set di file dal computer e li porti nuovamente dal primo computer (dove sono stati creati), non avrai ancora alcun errore.
  5. Dopo aver eseguito quella sequenza su una macchina specifica (includi / escludi il file pas dal progetto) - non puoi più ottenere questo errore su quella macchina, non importa quanto ci provi (sposta i file tra le cartelle, gioca con le impostazioni , ecc., ecc.). In realtà, non ho già macchine, dove posso riprodurre questo errore in questo momento :(

Non vedo come la situazione "dopo" è diverso dalla situazione "prima" (dopo / prima dell'inclusione del file pas), quindi l'errore è visibile solo prima e non dopo.

L'unica menzione di questo errore (o un errore molto simile) su Internet è questo . Ma non c'è soluzione. Non ci sono " + " caratteri nel percorso né negli spazi (" ").

Mi sto perdendo qualcosa? In questo momento mi sembra un bug di C ++ Builder.

P.S. Non possiamo usare " basta includere pas-file " soluzione, poiché è necessario distribuire solo .hpp e .obj (nessun file .pas ) su determinate macchine.

È stato utile?

Soluzione 3

Va ??bene, ho trovato la risposta: il motivo erano alcune impostazioni dell'IDE o del progetto errate (non lo so per certo).

Ho diverse versioni di C ++ Builders e Delphis installate. E per qualche ragione il linker di C ++ Builder del 2009 ha raccolto file obj errati, quelli che dovrebbero essere usati per un'altra versione (possibile 2007).

Il motivo dell'errore è stato che NewInstance è stato modificato tra le versioni 2007 e 2009 - vedere qui: https://forums.codegear.com/thread.jspa?messageID=161105

Altri suggerimenti

Stavo anche ricevendo questo errore ma era perché l'ho avuto questo definito:

virtual void getMaxSafeSpace();

Invece di:

virtual void getMaxSafeSpace()=0;

nella mia classe astratta.

Sembra che se si crea il progetto dai file pas, una copia della funzione '__fastcall System :: TObject :: NewInstance (System :: TMetaClass *)' viene definita da qualche parte, ma non nei file obj, e collegato al binario. Una volta definita la funzione, la trova il file XXX.obj. Quindi, se si eliminano i file obj correnti e si portano i file obj da un'altra macchina, l'errore non viene visualizzato. Questo è solo il mio pensiero. Non conosco Delphi né ho idea di pas file o C ++ Builder.

Il tuo progetto sta creando dll o qualche tipo di librerie esterne in cui la funzione System :: TObject :: NewInstance () è definita e collegata al binario?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top